程序不会在c中以2d数组存储字符

时间:2017-11-16 23:22:38

标签: c arrays getchar

我正在创建一个程序,我插入一些句子,程序按顺序输出。我已经完成了程序,但是当我运行它时,似乎我输入到数组中的字符没有正确显示或存储,因此得到随机字母而不是完整的句子。这是该程序的代码:

char ch;
int i,j,k;
int nothing = 0;
int count = 1;
char lines[5][256];
int length[256];

int main() {
    printf("Please insert up to a max of 5 lines of text (Press enter to go to next line and twice enter to stop the program):\n");
    i = 0;
    while (i<5){

        j = 0;
        ch = getche();

        if (ch == '\r'){
            if(i!= 0){
                break;    
            }
            printf("You have not inserted anything, please insert a line:");
            i=-1;   
        }

        if(ch != '\r'){
            lines[i][j]=ch;
            while (ch!='\r'){
                ch = getche();
                lines[i][j] = ch;
                j++;
            }
        }
        printf("\n");
        i++;
    }
    for (k=i ; k > 0; k--){ 
        printf("\tphrase %i :", count);
        for ( j =0 ; j <= length[k]; j++){
            printf("%c",lines[j][k]);
        }
        count++;
        printf("\n");
    }   
    return 0;
}

如何正确存储和显示字符?感谢任何帮助,谢谢!!

1 个答案:

答案 0 :(得分:3)

您的代码存在许多问题。我将在这里尝试总结,并为您提供改进的代码。

Fist,我为了在我的系统上编译而进行了一些更改:

  1. getche()更改为getchar()getche()似乎无法在Ubuntu上使用。)
  2. 我拿出了关于重新输入一个字符串的部分,并专注于其余部分(因为逻辑略有破坏,与你的问题无关)。在它继续之前,它仍然会检查至少一行。
  3. 我必须将\r的支票更改为\n
  4. 我将您的length数组更改为5,因为您只有最多5个字符串(不是256个)的长度。
  5. 代码中的一些问题:

    1. 您从未更新主length[]循环中的while数组,因此程序永远不知道要打印多少个字符。
    2. 数组是零索引的,因此您的最终打印循环会跳过字符。我将for参数更改为从0开始,并且最多可以k < i,因为您在上一个循环中的最后一个字符后更新了i。与j相同。
    3. 您在打印循环中对数组的引用是错误的(因此您将从内存中的随机区域打印)。已将lines[j][k]更改为lines[k][j]
    4. 无需单独的count变量 - 只需使用k即可。已移除count
    5. nothing变量未被使用 - 删除它。
    6. #include <stdlib.h>
      #include <stdio.h>
      
      char ch;
      int i,j,k;
      char lines[5][256];
      int length[5];
      
      int main()
      {
          printf("Please insert up to a max of 5 lines of text (Press enter to go to the next line and twice enter to stop the program):\n");
          i = 0;
          while (i<5)
          {
              j = 0;
              ch = getchar();
      
              if ((ch == '\n') && (j == 0) && (i > 0))
              {
                  break;
              }
      
              if (ch != '\n')
              {
                  while (ch != '\n')
                  {
                      lines[i][j] = ch;
                      j++;
                      ch = getchar();
                  }
              }
              length[i] = j;
              printf("\n");
              i++;
          }
          for (k = 0; k < i; k++)
          {
              printf("\tPhrase %i : ", k);
              for (j = 0; j < length[k]; j++)
              {
                  printf("%c", lines[k][j]);
              }
              printf("\n");
          }
          return 0;
      }