好的,所以我试着学习一些C.我正在尝试编写一个程序,它将有一个数字并让用户提出一个数字。
我猜完所有事后都会接受用户询问用户是否想再玩一次。如果他们输入Y或y,则游戏将重新开始,如果他们输入“N”或“n”,则程序将终止。
我想做什么
int main(){
while(playAgain == 'y' || 'Y') {
*playing code here*
printf("would you like to play again");
scanf("%s", &playAgain);
}
它根本没有破坏......永远,无论我输入什么。我做错了什么?
答案 0 :(得分:3)
这里的问题(除了评论中的内容)是你的条件语义。您希望playAgain == 'y' || 'Y'
被解释为playAgain equals 'y' or playAgain equals 'Y'
。
相反,它被解析为(playAgain equals 'y') or ('Y')
。由于true定义为非零,'Y'
非零(ASCII值为131),'Y'
始终为true,并且条件始终为true。你想要:
while (playAgain == 'y' || playAgain == 'Y')
答案 1 :(得分:2)
我猜这里的类型是playAgain是char?
您没有正确使用scanf。 http://www.cplusplus.com/reference/cstdio/scanf/
使用%s的scanf期望读取字符串。在C中,字符串是char *,因此它将使用指针值写入playAgain,丢弃顶部位。这几乎是一个随机值,比较将失败。如果你想把playAgain作为一个角色,你应该使用%c。
顺便说一句,它不是美元。
或者,您可以将playAgain实现为字符串。在这种情况下,你可以这样做:
int main(){
char playAgain[buffer_size];
do{
/*playing code here*/
printf("would you like to play again");
scanf("$s", &playAgain);
lower_case_string( playAgain); // Call a function for changing string to lower case
}while( !strcmp( "yes", playAgain) || !strcmp( "y", playAgain );
}
答案 2 :(得分:1)
您必须修复代码中的一些内容:
char playAgain = 'y';
while(playAgain == 'y' || playAgain == 'Y') // *1
{
//*playing code here*
printf("would you like to play again? ");
scanf("%s", &playAgain); //*2
}
* 1您必须将每个条件分为AND或OR(&&或||)。
* 2使用scanf参数的正确格式是使用“%”,而不是“$”。在此处查看更多使用信息:http://www.cplusplus.com/reference/cstdio/scanf/
在你的代码修复之后,循环同时将重复用户输入任何以'y'或'Y'开头的单词,例如'Yellow'将在此代码中重启循环。如果要控制引入的完整字符串,则必须使用char数组或字符串,并将其与辅助函数进行比较,如下所示:
bool compareArrays(char* str1, char* str2, int lenght)
{
int i;
for (i=0; i<lenght; ++i)
if (str1[i] != str2[i]) return false;
return true;
}