为什么 getchar() 没有收到任何输入?
Why doesn't getchar() receive any input?
我制作了一个程序来查看你的名字,如果你是男性还是女性,你多大了,以及我应该称呼你为 Mrs、Ms、Mr 还是只称呼你的全名,具体取决于之前的条件。当我选择性别为女性并输入名字、姓氏和大于或等于 20 岁的年龄时,我会询问该人是否已婚,但无论出于何种原因,程序都会跳过 getchar
,并且只是完成程序。
代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char gender;
char fName[15];
char lName[15];
char mar;
char str[] = "Then I shall call you";
int age = 0;
printf("What is your gender (M or F): ");
gender = getchar();
printf("First name: ");
scanf("%s", fName);
//fgets(fName, 16, stdin);
//fName[strcspn(fName, "\n")] = 0;
printf("Last name: ");
scanf("%s", lName);
//fgets(lName, 16, stdin);
//lName[strcspn(lName, "\n")] = 0;
printf("Age: ");
scanf("%d", &age);
puts("");
if(gender == 'F' || gender == 'f')
{
if(age >= 20)
{
printf("Are you married, %s (y or n)?: ", fName);
//scanf("%c", &mar);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'n' && age >= 20|| mar == 'N' && age >= 20)
printf("%s Ms. %s.\n", str, lName);
}
else
printf("%s %s %s.\n", str, fName, lName);
}
else if(gender == 'M' || gender == 'm')
{
if(age >= 20)
printf("%s Mr. %s.\n", str, lName);
else
printf("%s %s %s.\n", str, fName,lName);
}
return 0;
}
并且输出:
What is your gender (M or F): F
First name: Jane
Last name: Doe
Age: 25
Are you married, Jane (y or n)?:
我还有一个问题,关于我何时使用 fgets
而不是 scanf
来读取字符串。正如我听说在读取字符串时通常远离 scanf
我尝试 fgets
但输出不是我想要的那样。
这是我使用 fgets
而不是 scanf
时的输出:
What is your gender (M or F): M
First name: Last name: Joe
Age: 23
Then I shall call you Mr. Joe.
输出应该和我使用 scanf
时一样,所以姓在名字下面。
问题是scanf
。它不会从输入缓冲区中删除换行符,因此 getchar
读取的第一件事是 \n
-char.
要解决这个问题,您可以在之前添加一个 getchar
调用,这样字符就会从缓冲区中移除,而下一个 getchar
会读取您的输入。像这样:
...
scanf("%d", &age);
...
getchar();
mar = getchar();
...
Why doesn't getchar()
receive any input?
代码有 2 个问题:
1) 它得到了上一行剩下的 '\n'
,使用 scanf(" %c", &mar);
(注意 space)或者更好,用 fgets()
替换所有输入
2) 没有报告意外输入。代码应该检测并报告意外输入并处理所有可能的逻辑路径。示例:
{
printf("Are you married, %s (y or n)?: ", fName);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'N' || mar == 'n') {
if (age >= 20)
printf("%s Ms. %s.\n", str, lName);
else
printf("%s ??? %s.\n", str, lName);
}
else {
printf("Unexpected input char:'%c' code:%d\n", mar, mar);
}
}
我制作了一个程序来查看你的名字,如果你是男性还是女性,你多大了,以及我应该称呼你为 Mrs、Ms、Mr 还是只称呼你的全名,具体取决于之前的条件。当我选择性别为女性并输入名字、姓氏和大于或等于 20 岁的年龄时,我会询问该人是否已婚,但无论出于何种原因,程序都会跳过 getchar
,并且只是完成程序。
代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char gender;
char fName[15];
char lName[15];
char mar;
char str[] = "Then I shall call you";
int age = 0;
printf("What is your gender (M or F): ");
gender = getchar();
printf("First name: ");
scanf("%s", fName);
//fgets(fName, 16, stdin);
//fName[strcspn(fName, "\n")] = 0;
printf("Last name: ");
scanf("%s", lName);
//fgets(lName, 16, stdin);
//lName[strcspn(lName, "\n")] = 0;
printf("Age: ");
scanf("%d", &age);
puts("");
if(gender == 'F' || gender == 'f')
{
if(age >= 20)
{
printf("Are you married, %s (y or n)?: ", fName);
//scanf("%c", &mar);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'n' && age >= 20|| mar == 'N' && age >= 20)
printf("%s Ms. %s.\n", str, lName);
}
else
printf("%s %s %s.\n", str, fName, lName);
}
else if(gender == 'M' || gender == 'm')
{
if(age >= 20)
printf("%s Mr. %s.\n", str, lName);
else
printf("%s %s %s.\n", str, fName,lName);
}
return 0;
}
并且输出:
What is your gender (M or F): F
First name: Jane
Last name: Doe
Age: 25
Are you married, Jane (y or n)?:
我还有一个问题,关于我何时使用 fgets
而不是 scanf
来读取字符串。正如我听说在读取字符串时通常远离 scanf
我尝试 fgets
但输出不是我想要的那样。
这是我使用 fgets
而不是 scanf
时的输出:
What is your gender (M or F): M
First name: Last name: Joe
Age: 23
Then I shall call you Mr. Joe.
输出应该和我使用 scanf
时一样,所以姓在名字下面。
问题是scanf
。它不会从输入缓冲区中删除换行符,因此 getchar
读取的第一件事是 \n
-char.
要解决这个问题,您可以在之前添加一个 getchar
调用,这样字符就会从缓冲区中移除,而下一个 getchar
会读取您的输入。像这样:
...
scanf("%d", &age);
...
getchar();
mar = getchar();
...
Why doesn't
getchar()
receive any input?
代码有 2 个问题:
1) 它得到了上一行剩下的 '\n'
,使用 scanf(" %c", &mar);
(注意 space)或者更好,用 fgets()
替换所有输入
2) 没有报告意外输入。代码应该检测并报告意外输入并处理所有可能的逻辑路径。示例:
{
printf("Are you married, %s (y or n)?: ", fName);
mar=getchar();
printf("%c\n", mar);
if(mar == 'Y' || mar == 'y')
printf("%s Mrs. %s.\n", str, lName);
else if(mar == 'N' || mar == 'n') {
if (age >= 20)
printf("%s Ms. %s.\n", str, lName);
else
printf("%s ??? %s.\n", str, lName);
}
else {
printf("Unexpected input char:'%c' code:%d\n", mar, mar);
}
}