正确填充空C字符串

问题描述 投票:0回答:2

我正在尝试实现“希伯来加密”,其工作原理如下:

  • 输入列数和行数
  • 输入要加密的文字
  • 用文本填充数组
  • 先输出文本列

示例:

  • 5 x 4:“这是一个例子..”
This
is an
exam
ple..
  • 输出:“Ti phseli xesaa.nm。”

但是,我在处理短于数组空间的文本时遇到了麻烦:

  • 5乘4:“这是一个”
This 
is an

 ????

“?”在哪里?是随机(?)字符。

我的猜测是,我没有正确格式化字符串。目前我检查一个字符是否是 ' ' 或 ' ' 并将其替换为空格。

如有任何帮助,我们将不胜感激。

我的代码如下所示:

#include <stdio.h>
#include <string.h>

int main(void){
    int x, y; 
    
    printf("Please input rows and collumns: \n");
    scanf("%d", &x);
    scanf("%d", &y);
    char string[x*y];

    printf("Please insert text: \n");
    fgets(string, x*y, stdin);              //ignore \n from previous scanf (otherwise terminates
    fgets(string, x*y, stdin);              // immediately as \n is still there)

    int k = 0;
    char code[y][x];
    for(int i=0; i < x*y; i++){
        if(string[i] == '\n' || string[i] == '\0')
            string[i] = ' ';
    }
    for(int i=0; i < y; i++){
        for(int j=0; j < x; j++){
            code[i][j] = string[k];
            k++;
        }
    } 

    //output of matrix
    for(int i=0; i < y; i++){
        for(int j=0; j < x; j++){
            printf("%c ",code[i][j]); 
        }
        printf("\n");
    } 

    //matrix to message
    k = 0;
    char message[128];
    for(int j=0; j < x; j++){
        for(int i=0; i < y; i++){
            message[k] = code[i][j];
            k++;
        }
    } 

    printf("%s \n", message);

    return 0;
}
c string encryption
2个回答
2
投票

nul 填充字符串 然后读出结果,跳过空值

char string[x*y+1]; // you had it too small

...

    fgets(string, x*y+1, stdin);              //immediatly as \n is still there)
    int num_read = strlen(string);
    if(num_read < x*y+1 )
       memset(string+num_read,'\0',x*y+1-num_read);
    if (string[num_read ] == '\n' )
        string[num_read ] = '\0';

...

    char message[x*y+1];  // was way too small!
    for(int j=0; j < x; j++){
        for(int i=0; i < y; i++){
            if(code[i][j])
              message[k] = code[i][j];
            k++;
        }
    } 
    message[k]='\0' 

0
投票

你有两个问题

  1. 您需要初始化

    string
    变量中的所有字节,而不是使用
    for
    循环,您可以将其添加到
    fgets

    之前
    memset(string, ' ', x * y);
    

    所以现在字符串中的所有字节都是空格,那么您可以删除尾随的

    '\n'
    并用空格更改终止
    '\0'
    ,在
    fgets
    之后用

    size_t length;
    
    length = strlen(string);
    if (string[length - 1] == '\n')
        string[length - 1] = ' ';
    string[length] = ' ';
    
  2. 您需要将终止

    '\0'
    添加到
    message
    变量,在您填充
    message
    的循环中,在循环终止后附加
    message[k] = '\0';

    k = 0;
    char message[128];
    for(int j=0; j < x; j++){
        for(int i=0; i < y; i++){
            message[k] = code[i][j];
            k++;
        }
    }
    message[k] = '\0';
    
© www.soinside.com 2019 - 2024. All rights reserved.