Scanf未在C中执行[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scanf未在C中执行[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我的代码在执行printf后跳过scanf。我已经尝试了fflush(stdin)清除缓冲区中的任何输入而无济于事。这是一段代码。 printf(“按Enter继续: n”);

    printf("Do you want to perform another operation? Y or N 
");

    scanf("%c", &run_operation);
    if (run_operation != 'y' || run_operation != 'Y') {
        break;
    }

代码有什么问题?

答案

fflush(stdin)是未定义的行为。

来自7.21.5.2

如果流指向输入流或未输入最近操作的更新流,则fflush功能会将该流的任何未写入数据传送到主机环境以写入该文件;否则,行为未定义。

并且scanfstdin获得输入可能是 中的前一个输入stdin

scanf(" %c",&run_operation);
      ^^^
      Ensures that whitespace are consumed. 

这样可以解决问题。

另外只是检查它是否立即进入printf不是检查scanf成功的方法。检查scanf的返回值。

在这种情况下,你这样做: -

if( scanf(" %c",&run_operation) == 1){
    printf("%s[%c]
","scanf is successful with the character",run_operation);
}

要了解为什么scanf的空间解决了这个问题: -

来自standard 7.21.6.2p5

由白色空格字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败。

以上是关于Scanf未在C中执行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++静态库未在mac上的xcode中编译[重复]

“读取”命令未在“读取行”循环中执行[重复]

onActivityResult 未在 Android API 23 的片段上调用

Tablayout+view 寻呼机未在位置 0 显示片段

iphone / Objective c的最佳代码片段网站是啥[重复]

Listview 项目未在 Fragment Android 中显示