【发布时间】:2015-09-05 16:06:12
【问题描述】:
我做了一个程序来看看你叫什么名字,你是男是女,你多大了,我应该叫你夫人,女士,先生,还是只叫你的全名,取决于以前条件。当我选择我的性别为女性并输入名字、姓氏和大于或等于 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或fgets中将单个字符getchar()与多字符输入混合。当你按下 Enter 时,也会产生一个字符,你必须处理它。 -
使用
scanf(" %c", &mar);或getchar(); mar=getchar()。问题是因为前一个scanf留下的换行符。 -
调用系统函数时:
scanf(), 1) 始终检查返回值(不是参数值)以确保操作成功。 2) 当使用不自动跳过空格的输入/格式字符串时,在(例如)%s 之前在格式字符串中插入一个空格,这样所有前导空格都会被自动消耗。 3) 使用%s格式时,始终使用最大长度修饰符(需要比实际输入缓冲区长度小1)即%14s用于 15 个字符的输入缓冲区。
标签: c arrays string fgets getchar