这是新的,我有一个非常简单的问题。我在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;
}
答案 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()
来电之前。