我想要用 fgets 和 scanf 混合使用,但是会有 '\n' 遗留字符导致 fgets 的输出出现错误。我已经尝试使用以下方法: fseek(stdin, 0, SEEK_END); 它起作用了,这是一种不好的做法吗?
fseek在使用SEEK_END时,其行为未被C标准定义。 7.21.9.2/4 fseek函数: 对于文本流,偏移量必须为零,或者偏移量必须是与同一文件关联的流上一个先前成功调用ftell函数返回的值,并且whence必须是SEEK_SET。 此外,在stdin上使用fseek是不可靠的。 POSIX规定没有后备文件(管道、套接字等)的流是不可寻址的。 但在我看来,你正在尝试一种“错误”的解决方案:首先不要混合使用fgets和scanf。 scanf对用户输入很脆弱,而且正确处理scanf的错误很难。您可以改用fgets仅读取行,并使用sscanf提取输入。
fseek
“运行”了,由于stdin
不一定是可寻址的流,因此它并不具备可移植性。 2)如果它像你所暗示的那样工作,它并不等同于仅跳过一个'\n'
。 3)如果你在每个scanf
格式字符串的末尾加上一个' '
空格,则会消耗任何后续的空格,包括换行符。 - dxiv