C 使用字符串语句时执行

C 使用字符串语句时执行,c,C,好的。。所以我有那个代码,我不能正确地得到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");

好的。。所以我有那个代码,我不能正确地得到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");
}
您似乎喜欢使用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 );
您似乎喜欢使用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 );

在C中比较两个字符串应该使用的方法是strcmp,如中所示

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

你的陈述

while ( cChoose != "p" )

比较内存中两个指针的位置,其中一个CCOOSE指向堆栈上的数据,p指向静态数据。它们永远不会相等。

在C中比较两个字符串的方法是strcmp,如中所示

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

你的陈述

while ( cChoose != "p" )
比较内存中两个指针的位置,其中一个CCOOSE指向堆栈上的数据,p指向静态数据。它们永远不会相等。

你应该使用strcmp而不是!=检查选择的内容是否等于p

cChoose是一个指针,指向内存中数组的起始位置。它肯定不等于内存中的p开始位置,因此程序中会出现无限循环。

您应该使用strcmp而不是!=检查选择的内容是否等于p

cChoose是一个指针,指向内存中数组的起始位置。它肯定不等于内存中的p开始位置,因此在程序中得到无限循环。

语句:

strcmp ( cChoose, "p" )
必须使用,如果两个字符串相等,则返回零。 此外,如果将cChoose用作字符串,则必须使用两个字符作为cChoose的长度,因为字符串总是以空字符“-\0”结尾。因此,请使用:

char cChoose[2];
编辑:

scanf之前的getchar取首字母“p”,因此第一次不会发生任何事情。而第二次,getchar首先接收第一行中左边的“\n”,scanf正确读取p。 删除getchar,代码就会正常工作。

语句:

strcmp ( cChoose, "p" )
必须使用,如果两个字符串相等,则返回零。 此外,如果将cChoose用作字符串,则必须使用两个字符作为cChoose的长度,因为字符串总是以空字符“-\0”结尾。因此,请使用:

char cChoose[2];
编辑:

scanf之前的getchar取首字母“p”,因此第一次不会发生任何事情。而第二次,getchar首先接收第一行中左边的“\n”,scanf正确读取p。
删除getchar,您的代码就可以正常工作。

谢谢,非常适合。。。但是为什么说cChoose是INT?我不明白,如果getchar由于某种原因失败,它会返回一个带外值-1。否则,它将返回一个介于0和255(含0和255)之间的值。谢谢,工作正常。。。但是为什么说cChoose是INT?我不明白,如果getchar由于某种原因失败,它会返回一个带外值-1。否则,它将返回一个介于0和255(含0和255)之间的值。我已编辑了我的帖子。。即使使用CCOOSE[2],程序也只能在第二次尝试时识别p字母。为什么要在scanf语句之前放置一个getchar?正如我所了解的,这会阻止程序获取ENTER键。。这样,程序将只获得按下的键。。。那不对吗?不,那是错的。如果您使用getchar将输入p作为字符接收,那么您可能需要这样做。但是当你在做字符串比较时,你不需要它。。现在,我有了代码:[link]www.wikarus.com.br/code.txt[/link],没有getchar。。。然而,如果我选择p以外的任何一个字母,程序将启动一个无限循环。。。没有给我再打另一封信的机会,即使有扫描。。。为什么会这样我已经编辑了我的帖子。。即使使用CCOOSE[2],程序也只能在第二次尝试时识别p字母。为什么要在scanf语句之前放置一个getchar?正如我所了解的,这会阻止程序获取ENTER键。。这样,程序将只获得按下的键。。。那不对吗?不,那是错的。如果您使用getchar将输入p作为字符接收,那么您可能需要这样做。但是当你在做字符串比较时,你不需要它。。现在,我有了代码:[link]www.wikarus.com.br/code.txt[/link],没有getchar。。。但是,如果我选择p以外的任何字母,程序将启动
无限循环。。。没有给我再打另一封信的机会,即使有扫描。。。为什么会这样这不是一个已解决的问题,而是一个已产生的问题。如果输入流关闭,此代码将进入无限循环。您必须检查scanf的返回值并与EOF进行比较!最好使用getchar而不是scanf。如果你想真正可靠地看到提示,你还需要在扫描前刷新标准输出。这不是一个解决的问题,而是一个产生的问题。如果输入流关闭,此代码将进入无限循环。您必须检查scanf的返回值并与EOF进行比较!最好使用getchar而不是scanf。如果要真正可靠地看到提示,还需要在scanf之前刷新stdout。