我正在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;
}
答案 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");
}