fflush(stdin)语句的使用是否合适?

时间:2013-06-24 09:25:15

标签: c gets

要读取多字符串,我一直在使用gets()函数。 gets()函数的行为对我来说是不可预测的,我在每个fflush(stdin)语句之前使用语句gets()来避免问题。这种方式使用这种说法是否合适?什么是替代方法?

3 个答案:

答案 0 :(得分:3)

fflush只刷新输出流。

如果你想 flush stdin,请继续阅读,直到你得到EOF,例如:

int i;
while (((i = getchar()) != '\n') && (i != EOF));

答案 1 :(得分:2)

您可以使用fgets()代替gets():https://stackoverflow.com/a/4309760/1758762

正如其他人所说,gets()的规范替代方法是fgets()将stdin指定为文件流。

char buffer[BUFSIZ];

while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
    ...process line of data...
}

还没有人提到的是,gets()不包括换行符,而是fgets()。因此,您可能需要在fgets()周围使用包装来删除换行符:

char *fgets_wrapper(char *buffer, size_t buflen, FILE *fp)
{
    if (fgets(buffer, buflen, fp) != 0)
    {
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n')
            buffer[len-1] = '\0';
        return buffer;
    }
    return 0;
}

答案 2 :(得分:1)

您可以使用带有相应正则表达式的scanf语句。

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


或者也许是fgets声明。

fgets(str, sizeof(str),stdin));