我有一个家庭作业,基本上需要用户输入来创建一个高尔夫游戏,询问要玩多少个洞,每个洞的标准,并随机生成该人在那个洞上得到的东西,并将其打印出来。最后,它要求用户再次播放,输入y或Y表示是和n或N表示否,等等。我的程序中的所有内容都能正常工作,除了我无法再次播放功能。这是我的代码,特别是我的主要和再次播放方法:
int main() {
int holes, par, strokes, count = 1, low, high, go;
char *shotName;
go = 1;
while (go != 0) {
count = 1;
holes = readHoles();
do {
printf("\nHole number: %i\n", count);
par = readPar(holes);
low = 1;
high = par + 5;
strokes = calcStrokes(low, high);
shotName = getName(par, strokes);
printStatement(count, par, strokes, shotName);
count++;
}while (count <= holes);
go = goAgain();
}
return 0;
}
int goAgain() {
char *temp;
printf("\nWould you like to play again(Y/N)? " );
scanf("%s", temp);
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') {
printf("\nI am sorry that is invalid -- try again\n");
printf("Would you like to play again(Y/N)? " );
scanf("%c", &temp);
}
if (temp == 'y' || temp == 'Y') {
return 1;
} else {
return 0;
}
}
我想我只是混淆了如何使用while循环或while循环来完成这项工作。这是有效的,但是当我运行程序并达到我必须输入yes或no的程度时,我输入的任何内容都会导致程序突然崩溃。而且我不知道该怎么做。 基本上,我希望用户输入一些内容,如果是,则再次播放整个游戏,如果不是,则结束循环,如果是其他内容,则给出错误并再次提示。任何帮助表示赞赏今晚到期! :/谢谢
答案 0 :(得分:2)
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') {
temp不能同时全部4,所以总是会评估为true,将其更改为&&
答案 1 :(得分:1)
查看您的scanf语句。在一个方面,您没有传递变量的地址。
bool goAgain()
{
bool validInput = true;
char temp;
do
{
if (!validInput)
{
printf("\nI am sorry that is invalid -- try again");
}
printf("\nWould you like to play again(Y/N)? ");
scanf("%c", &temp); // <== Make sure you pass the address of your variable
validInput = (temp == 'y' || temp == 'Y' || temp == 'n' || temp == 'N');
} while (!validInput);
return (temp == 'y' || temp == 'Y');
}
答案 2 :(得分:1)
char *temp;
printf("\nWould you like to play again(Y/N)? " );
scanf("%s", temp);
您要求scanf
读取字符串,scanf
需要一个地址来写字符串。您使用temp
提供,但temp
未初始化为任何内容。您需要为temp
分配内存。这可以通过以下方式完成:
char temp[1024];
或
char *temp = malloc(1024);
应该修复你的崩溃。但是,1024字节的缓冲区大小完全是任意的,并且您无法保证用户的输入将适合该缓冲区。
在您的特定情况下,您可以读取单个字符而不是未知长度的字符串:
char temp;
printf("\nWould you like to play again(Y/N)? " );
scanf("%c", &temp);
请注意,现在您需要使用scanf
致电&temp
。 (如果您不理解原因,请参阅comp.lang.c常见问题中的Q12.12和Q12.12b。)However, beware of the newline left in the input buffer使用此方法。
一般来说,it's best to avoid scanf
entirely。 scanf
非常难以正确使用(更糟糕的是,使用起来并不明显)。
其他一些事情:
printf
调用后应跟fflush(stdout)
,以确保在等待用户输入时可以看到提示。temp == 'Y'
等。如果您打算将temp
设为字符串(char*
)而不是单个char
,则这些比较必须为temp[0] == 'Y'
等。答案 3 :(得分:0)
让我帮你整理一下循环。获得的经验:for()是你的朋友......
for (go = 1; go ; go = goAgain()
holes = readHoles();
for (count=0; count < holes; count++) {
printf("\nHole number: %i\n", 1+count);
/* Note: should this be: par = readpar(count+1); ?
** otherwise, it would be loop-invariant
** , and could be hoisted out of the loop.
*/
par = readPar(holes);
low = 1;
high = par + 5;
strokes = calcStrokes(low, high);
shotName = getName(par, strokes);
printStatement(count+1, par, strokes, shotName);
}
}
你可能会说count+1
(两次!)是丑陋的。在这种情况下,您可以更改循环条件:for (count=1; count <= holes; count++) {
。但请记住:那是非标准的习语。正常计算 从零开始。