【问题标题】:Why is scanf("%[^\n]s", ...) not capturing a string with spaces?为什么 scanf("%[^\n]s", ...) 不捕获带空格的字符串?
【发布时间】:2021-10-26 21:07:55
【问题描述】:

我一直在全球搜寻 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 exit\n");

    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;
}

感谢任何帮助。

【问题讨论】:

  • 我是初学者,不懂c++的细微差别。上面的代码是干净的C。
  • 您的代码没有任何明显错误。我试过了,效果很好。 "%[^\n]s" 中的 s 是错误的,但这不会导致任何问题。 printf("%100s" 中的 100 很奇怪,可能会导致输出以一种奇怪的方式出现在您的屏幕上。尝试将 printf 格式字符串更改为"%s\n"
  • scanf("%99[^\n]", c);代替scanf("%[^\n]s", c);(省略's'并添加最大字段宽度。)
  • 由于没有人费心链接任何文档,read this。特别注意集合符号 [...]%s 字符串格式说明符。它们不是连接的。使用其中一种。这是 C 新手难以置信常见的错误,我继续想知道哪些在线资源/教程等显示了这种错误形式。
  • 另外,%[...]属于“高级scanf使用”的范畴,而“高级scanf使用”有点像“高级三轮车骑行”。 scanf 是一个玩具功能,仅对最基本的介绍性程序有用。当你准备好做一些更高级的事情时(比如,“读取可能包含空格的字符串”),是时候离开使用 scanf 并学习如何使用 use something better

标签: c io scanf


【解决方案1】:

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 个空格,然后是字符串。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多