c-为什么我的循环请求可用字符两次



所以我有一个非常简单的代码来询问用户是否同意(我才刚刚开始(。目前,我已经设置了循环,允许用户用"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,因为当它是yn时,您会脱离循环。

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'换行符,它标志着行的末尾。

正在发生的事件顺序如下:

  1. 您调用get_char,它从输入流中提取'a''n',并返回'a'
  2. 您调用scanf,它从输入流中提取'a',但在输入流中保留'n'
  3. 您的程序检测到用户没有输入'y''n',因此会打印"only y/n please.n"
  4. 您再次调用scanf,它只是提取上一次对scanf的调用留下的'n',因此scanf不会从用户那里获得任何新的输入
  5. 您的程序错误地认为用户输入的是'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" );

最新更新