scanf在C中运行不正常

时间:2014-11-19 11:34:50

标签: c scanf

    if (a % 5)
            goto ask;
            else
            goto main;

ask:printf("Do You Want To Exit ? Y \\ N . . . \n");
        scanf("%c", &YN);
        getch();
        if (YN == 'Y')
        {
y:          system("cls");
            YN = 1;
            goto sign;
        }
        else if (YN == 'y')
            goto y;
        else if (YN == 'N')
        {
n:          system("cls");
            YN = 0;
            goto sign;
        }
        else if (YN == 'n')
        {
            goto n;
        }
        else
        {
            printf("Sorry ..Didn't Catch that ... ");
                goto ask;
        }
有人帮我理解我的问题 对于某些原因,我从这段代码得到的输出是 "你想退出你吗?" getchar ... "抱歉没有抓到你想退出y \ n? "

它似乎第一次跳过scanf(),程序直接转到else ==> "sorry i didnt get that" 并且只是在第二次它阐明了如何使用scanf()

4 个答案:

答案 0 :(得分:1)

scanf()使用%c读取字符,是的, ENTER 键按下[在您之前的输入之后]对于%c来说非常有用[请查看下面的内容]扰流板。

  

按ENTER键==换行符

使用

scanf(" %c", &YN);  //mind the space brefore `%c`
       ^
       |

忽略任何以前存储的[也是,前导]空格[包括换行符。]

注意:这也消除了对getch();

的需求

答案 1 :(得分:1)

scanf读取任何内容时,它会在输入缓冲区中通过 Enter 添加换行符。 "%c"格式读取输入缓冲区中的任何字符,包括换行符。因此,第一个调用将从输入缓冲区中读取并提取一个字符,但下一个调用将读取前一个调用中遗留的换行符。

在格式字符串中添加前导空格会让scanf在尝试解析和提取格式之前读取(并忽略)任何空格(空格,制表符,换行符)。

我建议你阅读,例如this scanf reference了解更多信息。

答案 2 :(得分:0)

%c之前添加空格,以便在首次输入stdin的数据后跳过您按下的scanf中的换行符。发生这种情况是因为scanf不会消耗您在输入任何字符后按下的\n字符(Enter键)。由于Enter键(\n)也是一个字符,它会被消耗由scanf第二次,因此不等待进一步的输入。

此外,使用goto通常是不好的做法。有关详细信息,请参阅this

答案 3 :(得分:0)

删除getch()你基本上做了两次同样的事情。