问题描述
我因getchar()而烦恼。我必须输入两次才能使我的代码正常工作。我这样写代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX_LEN 20
struct part {
int number;
char name[MAX_LEN + 1];
} part_1;
int main(void){
int ch,th;
for (;;) {
printf("Enter operation code: ");
while ( (ch = getchar()) != '\n' && ch != EOF){
switch (ch){
case 'i':
printf("Enter part number: ");
scanf("%d",&part_1.number);
while ( (th = getchar()) != '\n'); /*I use this to remove newline character*/
printf("Enter part name: ");
fgets(part_1.name,MAX_LEN,stdin);
break;
case 'q': exit(0);
}
}
}
}
运行编译器时,我希望结果如下:
Enter operation code: i
Enter part number: 1
Enter part name: test
Enter operation code: i
但是,我必须输入两次才能使代码正常工作:
Enter operation code: i
Enter part number: 1
Enter part name: test
-> /* This is where I have to press 'Enter' twice */
Enter operation code: i
解决方法
当您输入零件名称并按Enter时,fgets
将返回,break
从切换状态退出,并返回至while状态: while ( (ch = getchar()) != '\n' && ch != EOF){
。然后,您需要再按一次Enter键使条件false
变为for
语句,在该语句中它将再次打印“输入操作代码:”。
基本上,您希望找到一种方法,在读取零件名称后,同时从 和switch语句中退出。
现在,我不确定您是否确实希望它起作用,但是您可以尝试将while语句替换为:
[...]
for (;;) {
printf("Enter operation code: ");
ch = getchar();
if (ch != '\n') getchar(); // remove linebreak from stdin
switch (ch){
[...]
输出将如下所示:
Enter operation code: a
Enter operation code: b
Enter operation code: c
Enter operation code: i
Enter part number: 1234
Enter part name: hello
Enter operation code: d
Enter operation code: e
Enter operation code: f
Enter operation code:
Enter operation code:
Enter operation code: q