我的代码在执行printf后跳过scanf。我已经尝试了fflush(stdin)清除缓冲区中的任何输入而无济于事。这是一段代码。 printf(“按Enter继续:\ n”);
printf("Do you want to perform another operation? Y or N \n");
scanf("%c", &run_operation);
if (run_operation != 'y' || run_operation != 'Y') {
break;
}
代码有什么问题?
答案 0 :(得分:4)
fflush(stdin)
是未定义的行为。
来自7.21.5.2
如果流指向未输入最新操作的输出流或更新流,则fflush函数会将该流的任何未写入数据传递到主机环境写入文件; 否则,行为未定义。
scanf
来自stdin
的输入也可能是\n
中的上一个输入stdin
。
scanf(" %c",&run_operation);
^^^
Ensures that whitespace are consumed.
这将解决问题。
另外,只检查它是否立即转到printf
不是检查scanf
成功与否的方法。检查scanf
的返回值。
在这种情况下,您可以这样做: -
if( scanf(" %c",&run_operation) == 1){
printf("%s[%c]\n","scanf is successful with the character",run_operation);
}
要了解scanf
中的空格解决问题的原因: -
由空白字符组成的指令由读取输入到第一个非空格字符(仍未读取)执行,或者直到不再能读取任何字符。该指令永远不会失败。