2D char数组有问题,程序无法打印

时间:2019-02-10 16:04:28

标签: c arrays file

我正在2D char数组中苦苦挣扎,我想创建一个火车列表,但是这里似乎有些错误,因为我注册了7个名称后程序将自动关闭。 ..有人可以帮助我,并向我解释每次如何正确编写程序吗?谢谢。 **注意:***代码尚未完成*

#include <stdio.h>
#include <stdlib.h>

#include <string.h>
#define N 7
#define M 20
int main()
{  FILE *fp;
   fp=fopen("Lines.txt","w");
    int i,n;
   char trains[N][M];
   char train[M];
  for(n=0;n<N;n++)
 {
     scanf("%s", train);
     strncpy(trains[n],train,M-1);

  }
  for(n=0;n<N;n++)
 {
     for(i=0;i<M;i++)
     {
         printf("%s\n", trains[n][i]);
     }

  }


  return 0;
}

2 个答案:

答案 0 :(得分:1)

拥有

 char trains[N][M];

中的printf

 for(i=0;i<M;i++)
 {
     printf("%s\n", trains[n][i]);
 }

无效,因为trains[n][i]是一个字符,您将其打印为字符串(%s)

所有包含 for 的表格都可以替换为

 printf("%s\n", trains[n]);

否则,您可以按char编写char,但是当您到达null char时需要停止:

 for(i=0; trains[n][i] != 0 ; i++)
 {
     printf("%c", trains[n][i]);
 }
 putchar('\n');

您打开文件但未写入


您需要测试 fopen 的结果以检查文件是否已打开


其他问题

 scanf("%s", train);
 strncpy(trains[n],train,M-1);

strncpy不会复制最终的空字符

因为你有

char火车[N] [M];    字符火车[M];

使用中间的 train 是没有用的,并且不提供受保护的(如果长度不超过trains[x],则为受保护的语言)

您需要检查 scanf 的返回值,并且最多可以读取19个字符(M-1):

if (scanf("%19s", trains[n]) != 1)
  break;

您不能保证阅读7列火车,因此必须在:之后更改循环。

for (i = 0; i != n; ++i)
  printf("%s\n", trains[n]);

在这种情况下,您还可以使用 puts

如果您还想在打开的文件中写入

for (i = 0; i != n; ++i) {
  fprintf(sp, "%s\n", trains[n]);
  puts(trains[n]);
}

最后您的程序可以是

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

#define N 7
#define M 20

int main()
{ 
  FILE * fp=fopen("Lines.txt","w");

  if (fp == 0) {
    puts("cannot open Lines.txt");
    return -1;
  }

  int i,n;
  char trains[N][M];

  for(n = 0; n<N; n++)
  {
    if (scanf("%19s", trains[n]) != 1)
      break;
  }

  for(i = 0; i != n; ++i)
  {
      fprintf(fp, "%s\n", trains[i]);
      /*puts(trains[i]);*/
  }

  fclose(fp);
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
train1
train2
train3
train4
train5
train6
train7
pi@raspberrypi:/tmp $ cat Lines.txt 
train1
train2
train3
train4
train5
train6
train7
pi@raspberrypi:/tmp $ 

请注意,如果火车的名称超过19个字符,则会被剪切掉,例如:

pi@raspberrypi:/tmp $ ./a.out
train1
verylongnameofatrain
train3
train4
train5
train6
pi@raspberrypi:/tmp $ cat Lines.txt 
train1
verylongnameofatrai
n
train3
train4
train5
train6
pi@raspberrypi:/tmp $ 

答案 1 :(得分:0)

  for(n=0;n<N;n++)
 {
     for(i=0;i<M;i++)
     {
         printf("%s\n", trains[n][i]);
     }

  }

应该是

  for(n=0;n<N;n++)
  {
         printf("%s\n", trains[n]);

  }

这是因为在char数组trains中,每一行都包含您输入的字符串。当您执行trains[n][i]时,它将尝试访问字符串中的特定字符。

如果要打印每个字符,请尝试如下操作:

 for(n=0;n<N;n++)
 {
     for(i=0;i<M && trains[n][i]!='\0';i++)
     {
         printf("%c", trains[n][i]);
     }
     printf("\n");
  }