【发布时间】:2023-03-26 06:21:01
【问题描述】:
我有一个关于标准输入缓冲区内容检查的问题。
这行广受赞誉的代码:
int c; while((c = getchar()) != '\n' && c != EOF);
在发现垃圾时有效地丢弃标准输入缓冲区垃圾。如果缓冲区为空,则程序执行不会越过它。
有没有办法检查标准输入缓冲区中是否有垃圾(无论是由于用户错误、提前输入还是其他原因),并且仅在以防万一的情况下从上面执行“fflush-replacement line”找到垃圾了吗?
我更愿意以编程方式将其全部保留为标准 C 的普通 UNIX 风格,而不必使用特殊的解析工具,没有 yacc、bison、python、ruby、shell 脚本等,没有 Windows API,拜托.
提前致谢!
更新:
我希望这个例子能更多地说明我的问题:
//...
//this line should make sure stdin buffer is free from accidentally typed content
int c; while (( c = getchar()) != '\n' && c != EOF);
//this line won't show in case buffer is already clean
printf("Please enter an arbitrary number of float or symbolic values:\n");
//this line should read the real input user is being asked for
char* p = fgets(text, TEXT_SIZE, stdin);
if(p != NULL)
parse_and_process(text);
//...
当没有意外输入时,就会出现问题。 “垃圾”在这里被认为是在 printf( ) 提示出现时可能留在缓冲区中的任何东西。如果缓冲区已经干净,有没有办法绕过第一行?
【问题讨论】:
-
引用的 lineof 代码会删除
stdin中的所有内容,直到读取换行符或 EOF。那么您认为“垃圾”是什么? -
请编辑您的问题并添加一个演示问题的示例。
-
IMO,除了仅调用
while ((int c = getchar()) != '\n' && c != EOF);读取数据并检测到它之外,没有可移植的方法来“绕过第一行以防缓冲区已经干净”不以'\n'结尾。然后stdin为空,供下一个阅读。 -
感谢您的评论@chux。不幸的是,除非真的需要修复,否则我不会要求这样做。你提到的所有(1),(2)正是我想要阻止的。我的问题不排除在读取实际用户数据之后清理标准输入。