未知错误函数 'scanf("%[^\n]%*c", &sent);'

unknown error the function 'scanf("%[^\n]%*c", &sent);'

言归正传,我是C语言的初学者,刚刚在C程序中遇到了输入字符串的奇葩方法:

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    char ch, string[100], sent[100];
    scanf("%c", &ch);
    scanf("%s", &string);
    scanf("%[^\n]%*c", &sent);

    printf("%c\n", ch);
    printf("%s\n", string);
    printf("%s", sent);

    return 0;
}

这是错误:最后一行 (Sentence) 没有打印出来,不知道我哪里错了,但在研究中我发现了这段代码:

scanf(" %[^\n]%*c", &sent); //not theres a space before %[^\n]%*c; and then it worked (wtf)

你能解释一下为什么只添加一个 space 就可以吗?

格式字符串中的space(</code>)导致scanf跳过输入中的whitespace。它通常不需要,因为大多数 scanf 转换在扫描任何东西之前也会跳过 whitespace,但是不需要的两个是 <code>%c%[——所以使用 space在 %[ 之前有一个可见的效果。让我们看看您的 3 个 scanf 调用做了什么:

scanf("%c",&ch);           // read the next character into 'ch'
scanf("%s",&string);       // skip whitespace, then read non-whitespac characters
                           // into 'string', stopping when the first whitespace after
                           // some non-whitespace is reached (that last whitespace
                           // will NOT be read, being left as the next character
                           // of the input.)
scanf("%[^\n]%*c",&sent);  // read non-newline characters into 'sent', up until a
                           // newline, then read and discard 1 character
                           // (that newline)

所以第 3 次 scanf 将从结束第二次 scanf 的白色space开始读取。如果您将 space 添加到格式的开头,它将改为读取并丢弃白色 space 直到找到非白色 space 字符,然后开始读取 sent 与那个非白色 space 字符。

同样有趣的是,如果结束第二个 scanf 的白色space 恰好是换行符,会发生什么情况。在这种情况下,第三次 scanf 将完全失败(因为在换行符之前没有要读取的非换行符)并且什么都不做。将此处的 space 添加到第三个 scanf 可确保它不会因换行而结束(它将被丢弃为白色 space),因此它将始终将某些内容读入 sent,除非到达 EOF。