我试图通过提示用户输入四个字符来在文件中放置并获取+打印四个字符。但是,出现错误(致命错误:glibc 检测到无效的 stdio 句柄)。
经过调试,发现故障出在线路上fputc(c[3], putc)
。第四次提示用户后,无法将第四个字符c[3]放入文件中。
请帮助我理解。
这是我的代码:
FILE* putc = fopen("test3.txt", "w");
if(putc == NULL)
{
return 1;
}
char c[4];
for(int i = 0; i < 4; i++)
{
printf("char: ");
scanf("%s", &c[i]);
fputc(c[i], putc);
}
fclose(putc);
FILE* getc = fopen("test3.txt", "r");
if(getc == NULL)
{
return 1;
}
char abc;
while ((abc = fgetc(getc)) != EOF)
{
printf("%c", abc);
}
printf("\n");
fclose(getc);
scanf("%s", &c[i])
在读取和存储的输入后写入一个空字符。c
仅用四个元素定义,因此,当i
为 3 时,空字符将写入数组外部c
,从而损坏程序中的其他内存。一种解决方法是
c
放大并使用 进行扫描scanf("%1s", &c[i])
。另一种方法是使用 进行扫描
scanf(" %c", &c[i])
,跳过空格并读取单个字符,该字符放入c[i]
时不带终止空字符。我使用命令编译的 gcc 版本“Ubuntu 11.4.0-1ubuntu1~22.04”没有遇到错误
$ gcc -Wall -o foo foo.c
。你有什么版本的 gcc,你如何调用编译器/链接器?您提供什么输入?从调试器中检查数组 c[] 的内容。
顺便说一句,我建议为 putc 和 getc 选择不同的变量名,它们都是 C 标准库函数。从
man putc
:从
man getc
:另外,我不会使用 scanf(); 这通常是一个坏主意。请参阅更安全的替代品的解释。