1

好的..所以我有那个代码,但我无法正确执行 Do While 语句......

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

int main ()
{
    int nWinsPC, nWinsPlayer;
    char cChoose[1];
    do {
    system("cls");
        printf("Vamos jogar um jogo?\n");
        printf("-\n");
        printf("Escolha (p)edra, p(a)pel ou (t)esoura: ");
        getchar();
        scanf("%1[^\n]", cChoose);
    } while(cChoose != "p");
    system("pause");
}

那个系统应该很简单......当玩家没有输入“p”时,选择屏幕保持循环,但我无法让它工作......

:(

提前致谢

编辑

问题解决了:

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

int main ()
{
    int nWinsPC, nWinsPlayer;
    char cChoose[2];
    do {
    system("cls");
        printf("Vamos jogar um jogo?\n");
        printf("-\n");
        printf("Escolha (p)edra, p(a)pel ou (t)esoura: ");
        scanf("%s", cChoose);
    } while ( strcmp(cChoose,"p") );
    system("pause");
}
4

4 回答 4

3
int cChoose;
...
    cChoose = getchar();
} while( cChoose != 'p' && cChoose != EOF );

您似乎喜欢使用 scanf,可能是因为它会为您处理空格。相反,请尝试:

int cChoose;
...
    do cChoose = getchar(); while( isspace( cChoose ));
} while( cChoose != 'p' && cChoose != EOF );

(虽然这是一种奇怪的写法,实际上只是另一个使用 do/while 的例子。通常会这样写:

int cChoose;
...
    while( isspace( cChoose = getchar()))
        ;
} while( cChoose != 'p' && cChoose != EOF );
于 2012-10-08T17:09:17.457 回答
1

您应该使用在 C 中比较两个字符串的方法strcmp如下

while ( strcmp( cChoose, "p" ) )

strcmp如果字符串相同,则返回 0 (false),如果不同,则返回非零值。

你的陈述

while ( cChoose != "p" )

比较内存中两个指针的位置,其中一个cChoose指向堆栈上的数据,"p"另一个指向静态数据。他们永远不会平等。

于 2012-10-08T17:09:18.273 回答
0

您应该使用strcmp而不是“ != ”检查 cChoose 的内容是否等于“p”。

cChoose 是一个指针,它指向内存中数组的起始位置。它绝对不等于内存中的“p”起始位置,因此您在程序中得到了无限循环。

于 2012-10-08T17:17:13.277 回答
0

该声明 :

strcmp ( cChoose, "p" )

必须使用如果两个字符串相等则返回零。此外,如果您使用 cChoose 作为字符串,则必须使用两个字符作为 cChoose 的长度,因为字符串总是以空字符 - '\0' 结尾。所以,使用:

char cChoose[2];

编辑:

scanf() 之前的 getchar() 采用初始的“p”,因此第一次没有任何反应。而第二次,getchar() 首先接收到第一行中留下的 '\n',然后 scanf 正确读取了“p”。删除 getchar() 并且您的代码可以正常工作。

于 2012-10-08T18:04:32.310 回答