c-使用fflush(stdin)语句的合适程度



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

fflush仅刷新输出流。

如果您想刷新stdin,请继续读取,直到得到EOF,类似于:

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

您可以使用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] = '';
        return buffer;
    }
    return 0;
}

您可以将scanf语句与适当的正则表达式一起使用。

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


或者fgets语句

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

最新更新