C - 用户单个字符输入呈现奇怪的结果

时间:2012-12-04 16:56:37

标签: c input char clear

这是新的,我有一个非常简单的问题。我在C中制作一个简单的程序,要求用户输入如何处理char的选择。输入结果后,程序返回菜单。然而,它似乎采取某种鬼输入,好像char有一些未知的值。我需要将char设置回默认状态。

代码:

/* display menu for user */
void menu() {

    printf("\n- - - Phone Book Database - - -\n");
    printf("\nSelect an action:\n\n");
    printf("\tc:\tCreate a database entry.\n");
    printf("\ts:\tSearch the database entries.\n");
    printf("\td:\tDelete a database entry.\n");
    printf("\tq:\tQuit program.\n\n");

    printf("Enter choice: ");
    menu_choice = getchar();

    if(menu_choice != 'c' && menu_choice != 's'
        && menu_choice != 'd' && menu_choice != 'q') {
            printf("\n\n\tInvalid choice.\n");
            menu();
    }
    //fflush(stdin);
}

以下是输出示例:

- - - Phone Book Database - - -

Select an action:

    c:  Create a database entry.
    s:  Search the database entries.
    d:  Delete a database entry.
    q:  Quit program.

Enter choice: c

Enter name: test

Enter address: test

Enter number: 3

- - - Phone Book Database - - -

Select an action:

    c:  Create a database entry.
    s:  Search the database entries.
    d:  Delete a database entry.
    q:  Quit program.

Enter choice: 
    Invalid choice.

- - - Phone Book Database - - -

Select an action:

    c:  Create a database entry.
    s:  Search the database entries.
    d:  Delete a database entry.
    q:  Quit program.

Enter choice: q

输入c作为输入调用以下函数

/* creates a new record in array */
void create_record() {
    char name[MAX];
    char address[MAX];
    int number;

    rec_num++; /* add 1 to marker for record placement */

    printf("\nEnter name: ");
    scanf("%s", name);

    printf("\nEnter address: ");
    scanf("%s", address);

    printf("\nEnter number: ");
    scanf("%d", &number);

    strcpy(record[rec_num].name, name);
    strcpy(record[rec_num].address, address);
    record[rec_num].number = number;
}

4 个答案:

答案 0 :(得分:4)

看起来你已经有了答案,并且正在审核,这是正确的;使用getchar()将从stdin

中读取一个字符
printf("Enter choice: ");
menu_choice = getchar();

当我在控制台上看到此提示并输入c<enter key>时,它会导致两个字符转到stdin'c''\n'

第一次getchar();运行时,它只会选择留下换行符的'c'。在第二次迭代中,'\n'被拾取而不等待用户的任何事情;因此好像有“幽灵输入”。

我只是想指出,每当你从用户那里得到输入并且结果不是你所期望的那样,只要把它转回来验证发生了什么就不会有什么坏处,比如:

if(menu_choice != 'c' && menu_choice != 's'
    && menu_choice != 'd' && menu_choice != 'q') {
        printf("\n\n\tYou entered %c (%d).\n", menu_choice, menu_choice);
        printf("\tThat's an invalid choice.\n");
        menu();
}

会告诉你:

You entered
 (10).
That's an invalid choice.

在它不同的行之间,并且根据ASCII表检查该十进制结果,您会看到10 10 是换行符,这可以帮助您获得结果。

编辑:

使用换行符的1个选项 -

printf("what character?");
c = getchar(); // Get the character from stdin
getchar();     // consume the newline character that was left

第二种选择:

printf("what character?");
scanf("%c ", &c); // Get the character from stdin, note the space after the %c
                  // that will allow any special characters including \t and \n

如果你只是想获得角色然后以&amp;结束消耗'\n',你必须添加和转义换行符:

printf("what character?");
scanf("%c\\n", &c); 

答案 1 :(得分:2)

正如其他人所指出的那样,这是换行符。只需添加另一个

(void) getchar(); /* read and discard newline */

你只想读一个角色。

答案 2 :(得分:0)

返回字符'\ n'可能会留在stdin中,以便下次您到处时getchar()获取此信息。

尝试使用调试器查看使用getchar()获取的值,或者只是将其打印出来。

可能getchar()对您的应用程序来说不是一个很好的选择,并且scanf()会做得更好,这样就可以获取所有stdin,下次你应该为空来吧。显然,你需要为scanf提供多个char来写,就像你的其他代码一样。

然后,您只需查看数组中的第一个字符即可获取您的字符。

答案 3 :(得分:-1)

输入命令后,输入缓冲区上会留下一个迷路字符,几乎可以肯定是'\ n'。

要删除它,您可以添加:

fflush(stdin)

...就在getchar()来电之前。