我正在努力处理 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/