函数未扫描第二个值

  • 本文关键字:第二个 扫描 函数 c
  • 更新时间 :
  • 英文 :


我不得不用C为class编写一个roshambo函数,但遇到了一些小麻烦。我调用getThrow(int playerNum(函数来获取用户的字符输入,但它只在第一次调用时扫描值。需要澄清的是,在运行时,用户只需输入玩家一的值,第二次调用无法输入。我试着研究这个问题,但没有发现代码出了什么问题。我可以让它在不使用函数来获取输入的情况下运行,而是在主体中分配变量,但我真的很想知道我做错了什么,从长远来看,让我成为一个更好的程序员。代码如下(忽略根据需要工作的checkWinner函数(:

#include <stdio.h>
char getThrow(int playerNum);
void checkWinner(char p1Throw, char p2Throw);
int main(int argc, const char* argv[])
{
char p1Throw = getThrow(1);
char p2Throw = getThrow(2);
printf("Player 1's throw: %cn", p1Throw);
printf("Player 2's throw: %cn",p2Throw); 
checkWinner(p1Throw, p2Throw);
return 0;
}
char getThrow(int playerNum)
{
char throw;
printf("Player %d, please enter your choice <p>aper, <r>ock, or <s>cissors:n", playerNum);
scanf("%c", &throw);
return throw;


}
void checkWinner(char p1Throw, char p2Throw) {

if ((p1Throw == 'p') && (p1Throw == 'r'))
printf("nPlayer1 wins! Paper covers_rock!");
else if ((p2Throw == 'p') && (p1Throw == 'r'))
printf("nPlayer2 wins! Paper covers_rock!");
else if ((p1Throw == 'r') && (p2Throw == 's'))
printf("nPlayer1 wins! Rock breaks scissors!");
else if ((p2Throw == 'r') && (p1Throw == 's'))
printf("nPlayer2 wins! Rock breaks scissors!");
else if ((p1Throw == 's') && (p2Throw == 'p'))
printf("nPlayer1 wins! Scissors cut paper!");
else if ((p2Throw == 'p') && (p1Throw == 's'))
printf("nPlayer2 wins! Scissors cut paper!");
else
printf("n Draw, nobody Wins");
return;
}

感谢您的帮助!

当用户输入一个字符时,为了让程序看到该字符,用户还必须输入一个"return"('\n'(键。该"return"密钥不会在对scanf()的第一次调用中使用,因此这是对scanf()的第二次调用中读取的密钥

要解决这个问题,有几种可能性。

将调用更改为读取两个字符:

char dummy;
scanf( "%c%c", &throw, &dummy );

或者添加一个调用来消耗"return":

scanf( "%c", &throw );
getchar();

当然,对于健壮的代码,应该检查调用scanf()的返回值,以确保操作成功。

if( scanf( "%c", &throw ) != 1 )
{
fprintf( 'stderr', "scanf failed to read the input charn" );
exit( EXIT_FAILURE );
}
getchar();

然而,如果这是我的代码,我会将对scanf()的调用写成:

scanf(" %c", &throw);  // notice the leading space in the format string.

请注意,这不会添加任何额外的变量或任何额外的函数调用,并且需要对OP代码进行最小的更改。

注意:前导空格会导致消耗任何"空白"。在第一次呼叫scanf()时,不会有任何变化。在对scanf()的第二次调用中,剩余的'\n'(是"空白"字符之一(将被消耗掉。

您只读取一个字符。但是用户可能会点击至少两个字符,因为直到他们点击"你才会开始阅读;输入";。由于你只读这些字符中的一个,所以第二次读一个字符会读到";输入";。

我的建议是:如果你想读入一行输入并解析它,就写一段读入一行输出并解析它的代码。如果你想读取一行,就不要读取字符。

最新更新