问题描述
我想使用fgets
和scanf
混合它们,但是剩下'\n'
个字符,它们弄乱了fgets
的输出,我尝试使用:
fseek(stdin,SEEK_END);
它奏效了,这是不好的做法吗?
解决方法
C标准未定义fseek
与SEEK_END
的行为。
7.21.9.2/4 The fseek function:
对于文本流,offset应该为零,或者offset应该是对与同一文件相关联的流上的ftell函数的较早成功调用返回的值,并且wherece应该为SEEK_SET。
即使不这样,在stdin
上使用fseek也不可靠。 POSIX指出,没有支持文件(管道,套接字等)的 streams 是不可搜索的。
但是我认为您正在尝试“错误的”解决方案:请勿将fgets
和scanf
混在一起使用。
scanf
对于用户输入和适当的error handling of scanf
is hard来说是脆弱的。相反,您可能只使用fgets
来读取行并使用sscanf
来提取输入。