混用fgets和scanf函数,并使用fseek跳过换行符是否是一个不好的实践方式?

3

我想要用 fgetsscanf 混合使用,但是会有 '\n' 遗留字符导致 fgets 的输出出现错误。我已经尝试使用以下方法:

fseek(stdin, 0, SEEK_END);

它起作用了,这是一种不好的做法吗?


1
这与iostream标签无关。 - Patrick Roberts
3
1)即使 fseek “运行”了,由于 stdin 不一定是可寻址的流,因此它并不具备可移植性。 2)如果它像你所暗示的那样工作,它并不等同于仅跳过一个 '\n'。 3)如果你在每个 scanf 格式字符串的末尾加上一个 ' ' 空格,则会消耗任何后续的空格,包括换行符。 - dxiv
这个流无法定位是因为操作系统导致的吗? - GuillemVS
文件(通常)是可寻址的,键盘输入的字符则不是。 - stark
@GuillemVS 这是语言标准的问题,而不是操作系统支持的问题,正如已发表的答案所阐述的那样。 - dxiv
@dxiv 是的是的!我在看到答案之前就发了评论。 - GuillemVS
1个回答

5

fseek在使用SEEK_END时,其行为未被C标准定义。

7.21.9.2/4 fseek函数

对于文本流,偏移量必须为零,或者偏移量必须是与同一文件关联的流上一个先前成功调用ftell函数返回的值,并且whence必须是SEEK_SET。

此外,在stdin上使用fseek是不可靠的。 POSIX规定没有后备文件(管道、套接字等)的流是不可寻址的。

但在我看来,你正在尝试一种“错误”的解决方案:首先不要混合使用fgetsscanf

scanf对用户输入很脆弱,而且正确处理scanf错误很难。您可以改用fgets仅读取行,并使用sscanf提取输入。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接