gpt4 book ai didi

c - 意外循环 (C)

转载 作者:行者123 更新时间:2023-11-30 19:37:27 24 4
gpt4 key购买 nike

在 C: 中运行剪刀石头布程序时,我不断收到重复的循环:

#include <stdio.h>
#include <stdlib.h>


int getUserInput(userInput);
int getComputerInput(cpuInput);
int pickWinner(int player, int cpu);


int main()
{

int playerWins = 0;
int compWins = 0;
int ties = 0;

int userInput;
int cpuInput;
int userChoice =1;
int compChoice;
int decision;

while (userChoice != 4)
{

compChoice = getComputerInput();
userChoice = getUserInput(userInput);

printf("computer chose %d\n", compChoice); //for debugging
printf("you chose %d \n", userChoice);//for debugging

decision = pickWinner(userChoice, compChoice);

if (decision == 1)
{
playerWins++;
}
else if (decision == 2)
{
compWins++;
}
else if (decision == 3)
{
ties++;
}


}
printf("Final score is: \nPLAYER: %d \nCOMPUTER: %d \n", playerWins, compWins);






}

//generates a random number for computer, 1=rock 2= paper 3=scissors
int getComputerInput (int cpuInput)
{

srand(time(NULL));
int r = rand() %3 +1;
return r;
}

//prompts user for character input, then converts input into a number to return back to main
int getUserInput(userInput)
{
char playerPick ;


printf("Please choose R, P, or S. (Q for quit)\n");

playerPick = getchar();



switch(playerPick)
{

case 'R' | 'r':
printf("Player chose R. \n");
return 1;
break;

case 'p':
case 'P':
printf("Player chose P. \n");
return 2;
break;

case 's':
case 'S':
printf("Player chose S. \n");
return 3;
break;

case 'q':
case 'Q':
printf("player quit");
return 4;
break;

default:
printf("Invalid choice, choose again \n");
break;

}




}
//method for determining winner
int pickWinner(int player, int cpu)
{
if (player ==1 && cpu ==1)
{
printf("tie\n\n");
return 3;

}

else if (player==1 && cpu ==2)
{
printf("you lose, paper beats rock\n\n");
return 2;
}

else if (player ==1 && cpu ==3)
{
printf("you win, rock beats scissors\n\n");
return 1;
}

else if (player ==2 && cpu ==1)
{
printf("you win, paper beats rock\n\n");
return 1;
}

else if (player ==2 && cpu ==2)
{
printf("tie\n\n");
return 3;
}
else if (player ==2 && cpu ==3)
{
printf("you lose, scissors beats paper\n\n");
return 2;
}

else if (player ==3 && cpu ==1)
{
printf("you lose, rock beats scissors\n\n");
return 2;
}

else if (player ==3 && cpu ==2)
{
printf("you win, scissors beat paper\n\n");
return 1;
}

else if (player ==3 && cpu ==3)
{
printf("tie\n\n");
return 3;
}
}

输出:

enter image description here

它似乎将零传递回 getUserInput 方法,但我不明白为什么。

任何正确方向的提示将不胜感激。

如果这篇文章的格式不正确,我们深表歉意。

提前致谢

最佳答案

输入时,按Enter键结束输入。该键实际上作为换行符放入输入队列中。

因此,当您读取第一个字符时,您将获得输入的字符(例如'r')。但是,输入队列中的下一个字符是换行符,这将是第二次调用 getchar 将为您提供的内容。

有一些方法可以跳过这个。最简单的方法是执行额外的 getchar 调用来丢弃下一个字符。但是,如果这不是换行符(例如,如果用户输入了多个字母作为输入),那么这将不起作用。

另一种可能的解决方案是使用 fgets读取整行,并且只获取该行的第一个字符。问题是,如果您没有提供足够大的缓冲区来存储该行,您将遇到与以前相同的问题。

唯一安全的解决方案是将用户的输入作为字符读取。然后循环读取,直到获得换行符。您在循环中读取的字符将被简单地丢弃。

也许像这样的函数:

void skip_past_newline(void)
{
int c;

while ((c = getchar()) != '\n' && c != EOF)
{
// Do nothing
}
}

然后在读取用户输入后调用它:

playerPick = getchar();
skip_past_newline();
<小时/>

请注意上面介绍的 skip_past_newline 函数的一些事项:

  1. 接收 getchar 结果的变量是一个 int 变量。这其实很重要。

  2. 我不仅检查循环中的换行符,还检查 EOF。这表示您按下了文件结束组合键(Windows 控制台窗口中的Ctrl-Z)并且您应该退出程序。这项检查就是您需要将变量设置为 int 的原因。

关于c - 意外循环 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39811688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com