当用户按下回车键时,如何防止scanf()终止?

时间:2016-08-12 19:06:16

标签: c scanf

如果按下回车键,scanf()此后将停止接收输入。我尝试了很多方法:将数据更改为字符串并将其与null进行比较,与ASCII进行比较。但是,当用户按下回车键时,我无法阻止scanf终止。

3 个答案:

答案 0 :(得分:4)

  1. 使用fgets阅读一行文字。
  2. 如果fgets能够无误地读取该行,请使用sscanf从该行读取数字。
  3. 如果sscanf成功,请使用该号码。否则,请转到错误处理代码。
  4. char line[LINE_SIZE];
    if ( fgets(line, LINE_SIZE, stdin) != NULL )
    {
       int number;
       if ( sscanf(line, "%d", &number) == 1 )
       {
          // Use the number
       }
       else
       {
          // Deal with error
       }
    }
    

答案 1 :(得分:2)

我认为您并不完全了解scanf的工作原理。

如果您要求scanf读取整数(使用%d),则将读取整数。只要没有理由停止等待整数,它就不会停止 - 为什么会这样。您可能错过的部分是 sscanf忽略&#39;空格&#39; - 所有 RET TAB SPACE < / kbd>等被忽略,所有不会在屏幕上产生可见输出的内容

这意味着如果你点击 RET TAB SPACE ,它们将被忽略和{{ 1}} 仍然等待你的整数。

如果你使用另一个键,就像任何一个字符一样,很明显这不是一个整数,它将停止读取并返回程序(状态为0 =成功分配为零)。

答案 2 :(得分:0)

有很多方法可以解决这个问题。

见,例如:

#include<stdio.h>

int main(void){
    char enterCheck;
    int check;

    do{
        printf("Hit Enter:> ");
        if((scanf("%c",&enterCheck)) == 1){

            if (enterCheck == 10){
                printf("You pressed ENTER\n");
            }else{
                printf("You didn't press ENTER\n\n");
                while((check = getchar()) != 0 && check != '\n');
            }
        }else{
            printf("There was an Error!\n");
        }
    }while(enterCheck != 10);
    return 0;
}

输出:

michi@michi-laptop ~ $ ./program 
Hit Enter:> dsadas
You didn't press ENTER

Hit Enter:> 12
You didn't press ENTER

Hit Enter:> 
You pressed ENTER

如您所见,程序要求输入ENTER键。如果你没有击中它,它会再次询问。

现在仔细看看,思考并尝试更改此程序以执行您需要的操作。想一想当你需要检查用户是否按Enter键时你会怎么做。