为了读取多单词字符串,我一直在使用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));