EDIT2: 我自己解决了问题,将第38行和第56行的
我进行了一些调试,并在第一行后打印了
为什么它首先接受
我为此编写了一个
如果我只想验证字符 YNyn,则可以这样做:
在我的 verify 函数中,我查看我的第二个参数是否等于 2 或 3。(如果我有
我添加了
但是无济于事,我已经尝试将if语句重新格式化为一行,但没有成功。
这意味着,如果我输入的值对应于Y、N、y或n的ASCII值,则变量rc应该设置为1。不幸的是,它并没有做到这一点,问题在于if语句中。
正如你在上面看到的,在“89 78 121 110 - 89 -1”中,最后一个值(变量rc)的值为-1。这意味着我的if语句被省略了。为什么它们被省略而没有将rc设置为-1呢? 验证函数
answer = getchar();
替换成 scanf("%d", &answer);
,问题得到了解决,但我不知道为什么。
修复版本:
Do you order Fish? (Y/N): g
Please enter Y or N only: g
Please enter Y or N only: g
Please enter Y or N only: g
Please enter Y or N only: y
Fish choice (K- Haddock, T- Halibut): x
Please enter K or T only: x
Please enter K or T only: x
Please enter K or T only: x
Please enter K or T only: k
What size (L - Large, M - Medium, S - Small): x
Please enter S, M, or L only: x
Please enter S, M, or L only: x
Please enter S, M, or L only: x
Please enter S, M, or L only: l
How many orders do you want? (>=0): 2
编辑:
如果您要编译并查看源代码,请使用以下链接获取完整源代码: http://pastebin.com/raw.php?i=83y0SLHQ
目前,下面的所有内容都可以正常工作,但是现在出现了一个新问题:
输出结果:
Do you order Fish? (Y/N): y
Please enter Y or N only: n
Fish choice (K- Haddock, T- Halibut): s
Please enter K or T only: K
What size (L - Large, M - Medium, S - Small): x
Please enter S, M, or L only: L
How many orders do you want? (>=0): 2
问题: 注意,如果我输入 y
作为选项,即使它是有效的,它也会告诉我再次输入 Y 或 N?它不应该这样做。所有其他循环都有效,除了第一个带有(Y/N)的循环。我进行了一些调试,并在第一行后打印了
rc
的值,其 ASCII 值为 10
,这意味着我的 answer
值实际上读取了 \n
,然后只有在第二个提示之后,它才读取正确的 ASCII 值 y
并进行比较。为什么它首先接受
\n
?
旧文章
我有一个程序,需要验证用户的输入。如果用户输入 "y"、"Y"、"n" 或 "N",则它们通过验证。如果他们输入任何其他字符,则程序输出:请只输入 Y 或 N
。我为此编写了一个
verify
函数。像这样传递值:如果我只想验证字符 YNyn,则可以这样做:
verify("YNyn", 2);
YNyn 是我想要验证的字符,2 是大写字符的数量。在我的 verify 函数中,我查看我的第二个参数是否等于 2 或 3。(如果我有
verify("SMLsml", 3);
,则为 3,SML 是小中大)。我添加了
printf
来查看我 verify 函数中第一个参数的 ASCII 值,它们都正确对应。
输出: 这意味着 Y 是 89,N 是 78,y 是 121,n 是 110。- 是我输入的值(Y)的值。-1 是变量 rc
的值。Do you order Fish? (Y/N): Y
Y:89 N:78 y:121 n:110 - answer:89 rc:-1
问题: 如果语句没有通过验证,rc就不会被设置为1。
if ((answer == validAnswers[0])
|| (answer == validAnswers[1])
|| (answer == validAnswers[2])
|| (answer == validAnswers[3]))
{ rc = 1; }
我也尝试过:
if (answer == validAnswers[0]
|| answer == validAnswers[1]
|| answer == validAnswers[2]
|| answer == validAnswers[3]) {rc = -1 }
但是无济于事,我已经尝试将if语句重新格式化为一行,但没有成功。
这意味着,如果我输入的值对应于Y、N、y或n的ASCII值,则变量rc应该设置为1。不幸的是,它并没有做到这一点,问题在于if语句中。
正如你在上面看到的,在“89 78 121 110 - 89 -1”中,最后一个值(变量rc)的值为-1。这意味着我的if语句被省略了。为什么它们被省略而没有将rc设置为-1呢? 验证函数
int verifyLoop(char *validAnswers, int numChars) {
int answer, rc = -1;
if (numChars == 2) {
answer = getchar();
do {printf("\n%d %d %d %d - %d %d\n", validAnswers[0],validAnswers[1],validAnswers[2],validAnswers[3], answer, rc);
answer = getchar();
if ((answer == validAnswers[0])
|| (answer == validAnswers[1])
|| (answer == validAnswers[2])
|| (answer == validAnswers[3]))
{ rc = 1; }
if (rc == -1 && answer != -1)
{
printf("Please enter %c or %c only: ", validAnswers[0], validAnswers[1]);
while (answer != -1 && answer != '\n')
answer = getchar();
}
} while (rc == -1 && answer != -1);
}
else if (numChars == 3) {
answer = getchar();
do {printf("\n%d %d %d %d %d %d - %d\n", validAnswers[0],validAnswers[1],validAnswers[2],validAnswers[3],validAnswers[4],validAnswers[5], answer);
answer = getchar();
if (answer == validAnswers[0]
|| answer == validAnswers[1]
|| answer == validAnswers[2]
|| answer == validAnswers[3]
|| answer == validAnswers[4]
|| answer == validAnswers[5])
{ rc = 1; }
if (rc == -1 && answer != -1)
{
printf("Please enter %c, %c, or %c only: ", validAnswers[0], validAnswers[1], validAnswers[2]);
while (answer != -1 && answer != '\n')
answer = getchar();
}
} while (rc == -1 && answer != -1);
}
}
answer
的值是多少?)。 - Oliver Charlesworthstrchr()
函数。 - Brian Swift