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