我必须输入两次才能让我的 getchar() 工作
I have to enter twice for my getchar() to work
我对 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
当您输入零件名称并按回车键时 fgets
将从 switch-statement 中 return 和 break
退出并返回到 while-statement: while ( (ch = getchar()) != '\n' && ch != EOF){
。然后,您需要再按一次回车键,使条件 false
返回到 for
语句,在该语句中再次打印“输入操作代码:”。
基本上你想找到一种方法来从 和 switch-statement 和 while-statement 中突破,当一个部分名称被读取时。
现在,我不确定 您 是否希望它正常运行,但您可以尝试将 while-statement 替换为:
[...]
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
我对 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
当您输入零件名称并按回车键时 fgets
将从 switch-statement 中 return 和 break
退出并返回到 while-statement: while ( (ch = getchar()) != '\n' && ch != EOF){
。然后,您需要再按一次回车键,使条件 false
返回到 for
语句,在该语句中再次打印“输入操作代码:”。
基本上你想找到一种方法来从 和 switch-statement 和 while-statement 中突破,当一个部分名称被读取时。
现在,我不确定 您 是否希望它正常运行,但您可以尝试将 while-statement 替换为:
[...]
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