这是我从youtube教程修改的源代码。该计划的目的是:
它问你的年龄。如果你输入18或者更多,它会询问你的性别而不是打印,你可以输入dude或m'lady(取决于你的性别)。如果你把你的年龄小于18岁,则打印出“没什么可看的!”
我想确保如果输入不是我要求的(仅限数字或仅字符),则显示“输入无效”。在我的程序中,程序要求年龄的第一部分,当年龄输入是字母或符号时,它显示无效输入。但每当我将字母表与18a或18 /等数字结合起来时,就表明:
“请输入您的性别。(m / f)” “输入无效。”
另外,如果我输入18或更多,并转到程序询问有关性别(m / f)的部分,如果我输入数字或符号,则显示无效输入..但是当我像m1或m / m组合时显示:
“你可以进入这个网站。”
任何人都可以帮我解决如何解决这个问题?
#include <stdio.h>
#include <conio.h>
int main(void) {
char gender;
int age=0;
printf("Please enter your age. \n");
if(scanf(" %d",&age)!=1) {
printf("invalid input. \n");
return 0;
}
if(age>=18) {
printf("Please enter your gender.(m/f) \n");
if(scanf(" %s", &gender) !=1) {
printf("Invalid input.\n");
return 0;
}
else if(gender== 'm') {
printf("You may enter this website dude.\n");
}
else if(gender== 'f') {
printf("You may enter this website m'lady.\n");
}
else {
printf("Invalid input. \n");
return 0;
}
}
else if(age<18) {
printf("Nothing to see here! \n\n");
return 0;
}
return 0;
}
答案 0 :(得分:2)
如果您想避免这种行为,您应该阅读每个用户选项的整行,并完全验证它。
要阅读整行,您可以使用scanf(" %[^\n]",str)
(*),而不是使用%d
或%s
。然后,您可以验证用户输入,以检查它是否正是您想要的。
<强>附加:强>
要验证年龄,您可以使用strtol
解释here,并验证性别我认为简单的字符串比较就可以了。
(*)有几个选项可用于读取C中的整行(例如fgets),并且还有理由不使用scanf(" %[^\n]",str)
(可能的缓冲区溢出)但我试图向您展示解决方案使用您正在使用的功能,有关此主题的讨论,请查看this post。
答案 1 :(得分:0)
在您使用stdin
读取输入后,您正在处理的问题与保留在输入缓冲区(scanf
)中的字符有关。当您阅读age
时,转换会将stdin
的数字读取到组成的字节数和int
。 int
后面的任何其他字符都会保留在输入缓冲区中。 (例如18a
,scanf
读取18
,a
在以下内容后留在输入缓冲区中:)。
int c, age;
if (scanf (" %d", &age) != 1) {
printf ("invalid age input - conversion failed.\n");
return 1;
}
(注意>您也可以使用strtol
执行相同的额外字符检查,以便在转接后检查endptr
然后,您的输入缓冲区中的'a'
将被性别测试作为输入。 (因为它已经在输入缓冲区中,在{em>性别的提示后由scanf
自动读取)要检查是否已经消耗了所有输入,您只需检查字符是否是保留在输入缓冲区中的是'\n'
(用户按 Enter 的结果)。如果输入缓冲区中的下一个字符不是'\n'
,则在age
后面输入其他字符。
if ((c = getchar()) != '\n') {
printf ("invalid input - additional characters.\n");
return 1;
}
然后,您可以在检查剩余字符后强加您的年龄限制:
if (age < 18) {
printf ("Nothing to see here!\n\n");
return 1;
}
age
测试的简短示例可能是:
#include <stdio.h>
int main (void) {
int c, age;
if (scanf (" %d", &age) != 1) {
printf ("invalid age input - conversion failed.\n");
return 1;
}
if ((c = getchar()) != '\n') {
printf ("invalid input - additional characters.\n");
return 1;
}
if (age < 18) {
printf ("Nothing to see here!\n\n");
return 1;
}
printf ("\n age: %d\n\n", age);
return 0;
}
<强>实施例强>
$ ./bin/age
18
age: 18
$ ./bin/age
17
Nothing to see here!
$ ./bin/age
18a
invalid input - additional characters.
$ ./bin/age
aa
invalid age input - conversion failed.
仔细看看,如果您有任何问题,请告诉我。