2015-01-07 62 views
1

我想實現的「希伯來文加密」,其工作原理如下:填充空C字符串正確

  • 輸入列和行
  • 輸入的號碼文本加密
  • 填充文本陣列
  • 輸出文本collumns第一

實施例:

  • 5由4: 「這是一個例子。」
This 
is an 
exam 
ple.. 
  • 輸出:「鈦phseli xesaa。 。納米」

然而,我有麻煩的文本比所述陣列較短具有空間:

  • 5由4: 「這是一個」
This 
is an 

???? 

其中'?'是隨機的(?)字符。

我的猜測是,我不正確格式化字符串。目前,我請檢查是否一個字符爲「\ n」或「\ 0」,並用空格代替它。

任何幫助表示讚賞

我的代碼如下所示:

#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);    //immediatly 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; 
} 
+0

字符串大小和fgets參數應該是'x * y + 1',否則你會錯過最後的charaacter – Jasen

回答

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

你能解釋爲什麼消息[x * y]太小了嗎?爲什麼它完全是+11?我的代碼給了我一個完整填充數組的文本的輸出,所以我想知道爲什麼字符串應該對較小的輸入更大。 – kernelpanic

+0

@kernelpanic它太小了,因爲如果所有的x * y空格都被填充,'+ 11'是一個錯字,應該是'+ 1' – Jasen

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';