c语言 - 为什么 scanf( "%[^n]s" , ...) 不捕获带空格的字符串?



我一直在搜索全球,为什么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个空格,然后再打印字符串。

最新更新