拥有
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是没用的,并且不提供受保护的(如果不超过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 $