我的程序需要获取用户的输入并将其保存到外部文件以供将来参考。这是代码的基本概要。
void newActivity(FILE *foutput) {
char name[31];
char description[141];
finput = fopen("activities.txt", "a");
printf("\n What is the name of your activity (up to 30 characters):\n");
fgets(name, sizeof(name), stdin);
printf("\nEnter a brief description (up to 140 characters) of what %s is about:\n",
fputs(name, stdout));
fgets(description, sizeof(description), stdin);
if (finput == NULL) {
printf("\nCould not open file.");
exit(1);
}
fprintf(foutfile, "%s\n", name);
fprintf(foutfile, "%s\n", description);
fclose(foutfile)
}
当我运行一个只询问名称并打印该名称的简单测试程序时,一切都很好。它看起来像这样:
int main() {
char name[50];
fprint("What is your name? ");
fgets(name, sizeof(name), stdin);
fputs(name, stdout);
return 0;
}
与工作测试程序不同,我的程序在转移到第二个printf()
语句之前不会从用户那里获取任何输入。它确实读取printf
语句中的字符串,但返回值(null)
。
至于写入文件,两条fprintf
行应该这样做,但我无法确认它,因为输入文本没有被正确记录。
这是在main()
之外声明的函数。这会影响情况吗?
答案 0 :(得分:7)
这是不正确的:
printf("\nEnter a brief description (up to 140 characters) of what %s is about:\n", fputs(name, stdout));
fputs
会返回int
,而您的printf
想要一个字符串%s
。
删除fputs
,然后将name
传递给printf
:
printf("\nEnter a brief description (up to 140 characters) of what %s is about:\n", name);
将字符串写入文件时使用%s
:
fprintf(foutfile, "%s", name);
fprintf(foutfile, "%s", description);
请注意,您不需要\n
,因为fgets
会将\n
与字符串保持一致。
来自评论:我关注的是该程序无法[读取
fgets(name, sizeof(name), stdin)
的输入
当您的stdin
与之前的操作相比有额外的\n
时,通常会发生这种情况。例如,如果您之前的输入操作使用int
读取scanf
,您会看到此效果:
scanf("%d", &num);
fgets(name, sizeof(name), stdin);
如果用户按 5 输入 X 输入,程序会将num
设置为5
,但name
将设置为包含一个'\n'
的字符串,而不是'X'
。这是因为scanf
无法从缓冲区中删除 Enter 生成的'\n'
,因此scanf
找到它,并认为用户刚刚输入了一个空字符串。