EDIT2 :通过将第38行和第56行的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
值实际读入{{ 1}}然后仅在第二次提示后,它会读入正确的ASCII值\n
并进行比较。
为什么首先考虑y
?
我有一个程序,我必须验证用户输入。如果用户输入说“y”,“Y”,“n”或“N”,则它们通过验证。如果他们输入任何东西,程序输出:
\n
。
我为此制作了please enter Y or N only
函数。值如下传递给它:
如果我希望它只验证字符YNyn,我会这样做:
verify
YNyn是我要验证的字符,2是大写字符的数量。
在我的验证函数中,我看到我的第二个参数是否等于2或3.(如果我有verify("YNyn", 2);
SML是小中等大,那就是3。
我在verify("SMLsml", 3);
中添加了以查看验证函数中第一个参数的ASCII值是什么,并且它们都正确对应。
OUTPUT :这意味着Y为89,N为78,y为121,n为110.-后面的值为我输入的值(Y)。 -1是变量printf
的值。
rc
问题:if语句不验证,因此rc未设置为1.
Do you order Fish? (Y/N): Y
Y:89 N:78 y:121 n:110 - answer:89 rc:-1
我也尝试过:
if ((answer == validAnswers[0])
|| (answer == validAnswers[1])
|| (answer == validAnswers[2])
|| (answer == validAnswers[3]))
{ rc = 1; }
但是无济于事,我已经尝试将if语句重新格式化为一行,但是没有用。
这意味着如果我输入的值对应于Y,N,y或n的ASCII值,那么变量if (answer == validAnswers[0]
|| answer == validAnswers[1]
|| answer == validAnswers[2]
|| answer == validAnswers[3]) {rc = -1 }
应该设置为1.不幸的是它没有这样做,问题在于if语句。
如上所示,在rc
中,最后一个值(变量89 78 121 110 - 89 -1
),值为-1。这意味着省略了我的if语句。为什么省略它们而不将rc设置为-1?
验证功能
rc
答案 0 :(得分:3)
它报告-1并继续没有错误的原因是因为它实际上正在工作。 :)
然而,它报告-1,因为你的printf位于循环的顶部,并在
将您的printf
移到正上方循环的末尾,以查看正确的值。
答案 1 :(得分:-1)
打印后有一个getchar,那么你不是要比较第一个getchar的值,而是从第二个得到。