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

时间:2015-02-26 20:58:53

标签: c regex 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;
}

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您应该限制扫描并使用每行末尾的'\n'

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

您应该检查返回值以检查scanf是否确实扫描了整行。 它有两个原因可能会失败:

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

fgets用于工作会更有效。

答案 2 :(得分:0)

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;