我一直在搜索全球,为什么scanf()
不捕获空间,而通常的解决方案,如"%[^n]s"
或"%100s"
(设置字符串大到足以捕获输入)没有工作。
我的程序的总体目标是提示用户输入一个字符串,然后将该字符串存储在.txt文件中。我不相信我的问题是由fprintf()
引起的,而是由最初的控制台扫描引起的。
是的,我是初学者,不理解c语言的细微差别。为看似简单的语法错误道歉。这是我得到的。
#include <stdio.h>
int main()
{
errno_t inputfile;
FILE *stream;
inputfile = fopen_s(&stream, "inputfile.txt", "w");
printf("%s", "Enter a string. Press ENTER to exitn");
char c[100];
scanf("%[^n]s", c);
printf("%100s", c); //using printf() to check if scanf() worked.
//Messing around with specifier to see if problem
//is in printf(), which doesn't seem to be the case.
fprintf(stream, "%s", c);
fprintf(stream, "%s", "ENTER is a correct ending");
fclose(stream);
return 0;
}
任何帮助都是感激的。
scanf("%[^n]s", c);
不正确,删除说明符末尾的s
,还应使用宽度限制器以避免缓冲区溢出。
应该是:
scanf("%99[^n]", c); // leave 1 character for the null byte
尽管如此,您所描述的行为是出乎意料的,正如您在这里看到的:
https://godbolt.org/z/enq93MaG5
注意,我把你的代码变成了一个最小的可重复的例子,即我删除了不必要的代码,这是你从现在开始应该做的。
还需要注意的是,printf("%100s", c);
将有可能不希望的效果,将字符串向右调整,将剩余的字符作为空格打印到左侧,例如一个有10个字符的字符串将打印90个空格,然后再打印字符串。