Scanf未在C中执行

时间:2018-01-21 06:28:59

标签: c printf scanf stdin

我的代码在执行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;
    }

代码有什么问题?

1 个答案:

答案 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中的空格解决问题的原因: -

来自standard 7.21.6.2p5

  

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