2

好的,所以我正在尝试学习一些 C。我正在尝试编写一个具有数字并让用户询问数字的程序。

在它猜测它询问用户是否想再次玩之后,我已经接受了一切。如果他们输入 Y 或 y,那么游戏将重新开始,如果他们输入“N”或“n”,那么程序将终止。

我想做什么

int   main(){

 while(playAgain == 'y' || 'Y') {

*playing code here*



printf("would you like to play again");
scanf("%s", &playAgain);


 }

它不会破坏......根本......永远,无论我输入什么。我做错了什么?

4

3 回答 3

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')
于 2013-04-13T23:40:27.933 回答
2

我猜这里 playAgain 的类型是字符?

您没有正确使用 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 );
}
于 2013-04-13T23:44:28.627 回答
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/

修复代码后,循环 while 将始终重复用户键入以“y”或“Y”开头的任何单词,例如“黄色”将在此代码中重新启动循环。如果要控制引入的完整字符串,则必须使用 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;
}
于 2013-04-14T00:16:04.347 回答