使用scanf时getchar不会停止
我很难理解getchar()
。 在以下程序中, getchar
按预期工作:
#include int main() { printf("Type Enter to continue..."); getchar(); return 0; }
但是,在以下程序中, getchar
不会产生延迟,程序结束:
#include int main() { char command[100]; scanf("%s", command ); printf("Type Enter to continue..."); getchar(); return 0; }
我有以下我们的解决方法,它有效,但我不明白为什么:
#include int main() { char command[100]; int i; scanf("%s", command ); printf("Type Enter to continue..."); while ( getchar() != '\n') { i=0; } getchar(); return 0; }
所以我的问题是:
1.什么是scanf
在做什么? 为什么scanf
这样做?
2.为什么我的工作在工作?
3.模拟以下Python代码的好方法是什么:
raw_input("Type Enter to continue")
输入仅在您输入换行符后发送到程序,但是
scanf("%s", command );
将换行符保留在输入缓冲区中,因为%s
(1)格式在某些非空格后遇到第一个空白字符时停止, getchar()
然后立即返回该换行符,不需要等待进一步的输入。
您的解决方法有效,因为它在再次调用getchar()
之前清除输入缓冲区中的换行符。
要模拟行为,请在打印消息之前清除输入缓冲区,
scanf("%s", command); int c; do { c = getchar(); }while(c != '\n' && c != EOF); if (c == EOF) { // input stream ended, do something about it, exit perhaps } else { printf("Type Enter to continue\n"); getchar(); }
(1)请注意,在scanf
中使用%s
是非常不安全的,你应该将输入限制为缓冲区可以保持的字段宽度, scanf("%99s", command)
最多将读取99( sizeof(command) - 1)
)将字符转换为command
,为0终止符留出空间。
空格是5y3%s格式说明符的分隔符, 换行符被视为空格,因此它保持缓冲。 控制台输入通常是面向行的,因此随后对getchar()的调用将立即返回,因为“行”仍保持缓冲状态。
scanf("%s", command ); while( getchar() != '\n' ){ /* flush to end of input line */ }
同样,如果您使用getchar()或%c来获取单个字符,通常需要刷新该行,但在这种情况下输入的字符本身可能是换行符,因此您需要稍微不同的解决方案:
scanf("%c", ch ); while( ch != '\n' && getchar() != '\n' ){ /* flush to end of input line */ }
类似于getchar():
ch = getchar(); while( ch != '\n' && getchar() != '\n' ){ /* flush to end of input line */ }
当然,明智的做法是将这些解决方案包装成可以重复使用的独立专用输入函数,并将其用作放置常见输入validation和错误检查代码的地方(如Daniel Fischer的答案,它明智地检查EOF – 您通常希望避免在任何地方复制这些检查和error handling)。
我宁愿先使用fgets
,然后使用sscanf
来解析输入。 我一直在做这样的事情很长一段时间,这种行为比使用普通scanf
更容易预测。
好吧,我有一些更容易:添加另一个getchar()
…问题解决了!!
在获取命令输入后刷新标准输入。
fflush(stdin);
但是刷新输入流会导致未定义的行为(尽管Microsoft的C库将行为定义为扩展)。