首页 > 解决方案 > 为什么 scanf("%[^\n]s", ...) 不捕获带空格的字符串?

问题描述

我一直在全球搜寻为什么scanf()不捕获空间,并且通常的解决方案,例如"%[^\n]s"or "%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;
}

任何帮助表示赞赏。

标签: cioscanf

解决方案


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


推荐阅读