3

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

4

3 回答 3

3

fflush仅刷新输出流。

如果你想刷新标准输入,请继续阅读,直到你得到EOF,比如:

int i;
while (((i = getchar()) != '\n') && (i != EOF));
于 2013-06-24T09:29:20.803 回答
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;
}
于 2013-06-24T09:31:11.983 回答
1

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

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


或者可能是一个 fgets 声明。

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

于 2013-06-24T09:32:03.250 回答