c - 二维字符数组出现问题,程序无法打印

标签 c arrays file

我正在努力处理 2D 字符数组,我想创建一个火车列表,但似乎这里出了问题,因为在我注册了 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;
}

最佳答案

 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]);

否则你可以一个字符一个字符地写入,但是当你到达空字符时你需要停止:

 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 不会复制最终的空字符

因为你有

字符列车[N][M]; 字符列车[M];

使用中间train是无用的,并且不提供 protected (其大小如果不长于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 $ 

关于c - 二维字符数组出现问题,程序无法打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54618281/

相关文章:

c# - 在不使用数组的情况下,我可以更快地查看特定索引吗?

python - 我理解 os.walk 对吗?

c - 网络编程udp包

c - C中内核空间遍历祖先的结束标志

c - 执行返回 255

php - 按多列对多维数组进行排序

ruby - 如何同时迭代两个相似数组上的每个值

php - 如何 : Displayed image file name different than actual filename on server

php - 获取从资源传递给 fopen 的模式?

c - 一行中的多个不同类型的输入