如何在 scanf() 中使用正则表达式?

How to use regular expression in scanf()?

我正在尝试读取几个包含空格的字符串(每行一个字符串)。但是,我发现只有第一个 scanf() 有效。输入第一个字符串后,打印的结果不允许我输入第二个字符串。这是为什么?

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char str[128];
    char str1[128];
    scanf("%[^\n]", str);
    scanf("%[^\n]", str1);
    printf("%s\n", str);
    printf("%s\n", str1);
    return 0;
}

scanf 不支持正则表达式。

但它不起作用的原因是因为在第一行和第二行之间你没有阅读换行符。对于 "%[^\n]"scanf 尝试读取一个或多个不是换行符的字符。第二次调用不会读取任何内容,因为要读取的下一个字符是 \n

因此以下内容将起作用:

#include <stdio.h>
int main() {
    char str[128];
    char str1[128];
    scanf("%[^\n]", str);
    getchar();
    scanf("%[^\n]", str1);
    printf("%s\n", str);
    printf("%s\n", str1);
}

你应该限制扫描并消耗每行末尾的'\n'

scanf("%127[^\n]\n", str);

您应该检查 return 值以检查 scanf 是否确实扫描了整行。 它可能因 2 个原因而失败:

  • 如果在文件末尾
  • 更微妙:如果文件中的最后一行没有以换行符结束。

使用 fgets 会更有效率。

scanf("%[^\n]", str); 从不消耗 Enter 或 '\n'

一个简单的解决方案:

// scanf("%[^\n]", str);
*str = 0; scanf("%127[^\n]", str);  getchar();

scanf("%[^\n]%*c", str) 以各种方式失败:
如果用户输入超过缓冲区大小 - 1,则 str.
为 128 -1 或 127 如果用户输入只有 '\n',则不扫描任何内容,str 未初始化,'\n' 留在 stdin 中用于下一个输入。

综上所述,更好用fgets()

if (fgets(str, sizeof str, stdin) == NULL) Handle_EOForIOerror();
// remove potential trailing `\n`
buffer[strcspn(buffer, "\n")] = 0;