所以我有一个非常简单的代码来询问用户是否同意(我才刚刚开始(。目前,我已经设置了循环,允许用户用"y"或"n"回答,并告诉他们";只有y/n请";如果他们输入不同的字符。到目前为止,一切都几乎完美,然而,在输入"y"或"n"以外的字符时,更正消息会显示两次。有什么建议吗?
代码:
#include <cs50.h>
#include <stdio.h>
int main(void)
{
char answer = get_char("Do You Agree? y/n n"); // prompt user to answer question
do{
scanf("%c", &answer);
if (answer == 'y')
{
printf("Great!n");
break;
}
else if(answer == 'n')
{
printf("That's unfortunaten");
break;
}
else
{
printf("only y/n please.n"); // prompt user for acceptable character
}
}while (answer != 'y' || answer != 'n');
}
以下是它的回报:
Do You Agree? y/n
a
a
only y/n please.
only y/n please.
a
only y/n please.
only y/n please.
a
only y/n please.
only y/n please.
s
only y/n please.
only y/n please.
y
Great!
您不需要使用scanf()
,您已经要求使用get_char()
输入。只需在循环中移动它来代替scanf()
。
您不需要在while()
条件下检查answer
,因为当它是y
或n
时,您会脱离循环。
int main(void)
{
char answer;
while (1) {
answer = get_char("Do You Agree? y/n n"); // prompt user to answer question
if (answer == 'y')
{
printf("Great!n");
break;
}
else if(answer == 'n')
{
printf("That's unfortunaten");
break;
}
else
{
printf("only y/n please.n"); // prompt user for acceptable character
}
}
}
CS50函数get_char
将从输入流中提取整行输入,然后返回该输入的第一个字符。,假设线上只有一个字符。否则,它将重新提示用户输入。
函数调用
scanf("%c", &answer);
另一方面,将仅从输入流中提取单个字符,而不是整行,而不执行任何输入验证。scanf
提取的字符也可以是'n'
换行符,它标志着行的末尾。
正在发生的事件顺序如下:
- 您调用
get_char
,它从输入流中提取'a'
和'n'
,并返回'a'
- 您调用
scanf
,它从输入流中提取'a'
,但在输入流中保留'n'
- 您的程序检测到用户没有输入
'y'
或'n'
,因此会打印"only y/n please.n"
- 您再次调用
scanf
,它只是提取上一次对scanf
的调用留下的'n'
,因此scanf
不会从用户那里获得任何新的输入 - 您的程序错误地认为用户输入的是
'n'
而不是'y'
或'n'
,因此它会打印另一条错误消息
为了解决这个问题,我建议您只使用get_char
,不要将其与scanf
混合使用。与scanf
不同,函数get_char
永远不会返回'n'
字符。因此,函数get_char
更易于使用。
如果需要,您需要多次调用get_char
,因此应该将该函数调用移动到循环中,以便它替换对scanf
的调用。
在指出get_char()
比scanf()
更安全、更合适之后,我修改了我的评论代码。。。
char c;
while( ( c = get_char( "Do You Agree? y/n " ) ) != 'y' && c != 'n' )
printf("only y/n please.n");
if ( c == 'y' )
printf( "Great!n" );
else
printf( "That's unfortunaten" );