C简单程序出错

时间:2014-10-03 14:13:56

标签: c

这是大学实验室的一部分,TA告诉我有错误,但我没有任何线索。当我运行它时,它会询问我第一个char但是然后运行该程序并且没有在第二个scanf询问我。

#include <stdio.h>

int main(void) {
    char sen, ben;

    printf("Type in a character: ");

    scanf("%c", &sen);
    printf("The key just accepted is %d", sen);

    printf("\nType in another character: ");
    scanf("%c", &ben);
    printf("The key just accepted is %d", ben);
}

4 个答案:

答案 0 :(得分:1)

实际上这是C而不是C ++。将其另存为file.c。 试试这个:

#include <stdio.h>

int main(void) {
    char sen, ben;
    printf("Type in a character: ");
    sen = getchar();
    printf("The key just accepted is %d", sen);
    printf("\nType in another character: ");
    getchar();
    ben = getchar();
    printf("The key just accepted is %d", ben);
}

说明:输入第一个字符并按Enter键时,输入的ASCII码作为第二个字符。 我建议不要使用scanf。但是如果你把getchar放到“拿”输入的话,它会有两种方式。

答案 1 :(得分:1)

在第二个%c中的scanf之前添加空格将解决问题。

这样做是因为scanf在您输入第一个字符后不会使用\n字符并将其保留在stdin中。作为Enter键(\n)也是一个字符,它会被下一个scanf调用消耗掉。%c之前的空格将丢弃所有空格,如空格。

使用%c扫描角色(scanf)时,请在%c之前添加一个空格,因为这有助于减少混淆并帮助您。因此,在scanf和{{1}}中,您都可以添加空格。

答案 2 :(得分:0)

当您按下键然后按Enter键时,您输入了两个键。第一个是所需的密钥,例如a,第二个是密钥<enter>,通常写为\n。因此,您的第二个scanf会捕获结果\n

由于打印出\n字符并不会导致屏幕上很容易看到的内容,因此看起来您的程序只是跳过第二个scanf而只打印出来printf的固定部分没有容易看到的值。

解决此问题的一种方法是在要捕获的键之前消耗所有键击。这是通过在角色后接受更多输入来完成的,直到您看到换行符\n为止。一旦你看到那个角色,那么你下一次阅读。

// flush extra input up the to carriage return
char flush = 0;
while (flush != '\n') {
  scanf("%c", &flush);
}

// now read my desired input
scanf("%c", &ben);

答案 3 :(得分:-1)

那是因为没有人接受'\n'。像这样scanf致电scanf("%c%*c", &sen)%*c表示您要省略一个字符,即'\n'

顺便说一下,void main()是允许的。 main函数不是可执行文件的真正入口点,所以可以这样做。但似乎不是每个人都喜欢它。