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