再次播放功能c 我有一个家庭作业,基本上是用用户输入来创建一个高尔夫球游戏,询问要打多少个洞,每个洞有多少个洞,然后随机地生成那个人在那个洞上的东西,然后把它打印出来。最后,它要求用户重新播放,输入y或y表示是,输入n或n表示否,等等。我的程序中的所有内容都工作正常,只是我不能完全让播放功能正常工作。这是我的代码,特别是我的main和play-reach方法: 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;
} 我猜我只是对如何使用while循环或dowhile循环来完成这项工作感到困惑。这是可行的,但当我运行程序并必须输入是或否时,我键入的任何内容都会导致程序突然崩溃。我不知道该怎么办。 基本上,我希望用户输入一些东西,如果是的话,再次玩整个游戏,如果不是,结束循环,如果是其他东西,给他们一个错误并再次提示他们。感谢您今晚的帮助!:/谢谢再次播放功能c 我有一个家庭作业,基本上是用用户输入来创建一个高尔夫球游戏,询问要打多少个洞,每个洞有多少个洞,然后随机地生成那个人在那个洞上的东西,然后把它打印出来。最后,它要求用户重新播放,输入y或y表示是,输入n或n表示否,等等。我的程序中的所有内容都工作正常,只是我不能完全让播放功能正常工作。这是我的代码,特别是我的main和play-reach方法: 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;,c,function,while-loop,do-while,C,Function,While Loop,Do While,} 我猜我只是对如何使用while循环或dowhile循环来完成这项工作感到困惑。这是可行的,但当我运行程序并必须输入是或否时,我键入的任何内容都会导致程序突然崩溃。我不知道该怎么办。 基本上,我希望用户输入一些东西,如果是的话,再次玩整个游戏,如果不是,结束循环,如果是其他东西,给他们一个错误并再次提示他们。感谢您今晚的帮助!:/谢谢 while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') { temp不能同时为所有4
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') {
temp不能同时为所有4,因此这将始终计算为true并将其更改为&&
temp不能一次全部为4,因此这将始终计算为真,将其更改为&&让我帮您整理一下循环。经验教训:因为是你的朋友
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);
}
}
你可能会争辩说计数+1两次!它很难看。在这种情况下,您可以更改循环条件:对于count=1;计数让我帮你整理一下线圈。经验教训:因为是你的朋友
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);
}
}
你可能会争辩说计数+1两次!它很难看。在这种情况下,您可以更改循环条件:对于count=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');
}
看看你的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');
}
您要求scanf读取字符串,scanf需要一个地址来写入字符串。您为它提供了temp,但temp没有初始化为任何值。您需要为temp分配内存。这可以通过以下方式实现:
char temp[1024];
或
这应该可以修复你的崩溃。但是,1024字节的缓冲区大小是完全任意的,您无法保证用户的输入将适合该缓冲区
在特定情况下,您可以读取单个字符,而不是未知长度的字符串:
char temp;
printf("\nWould you like to play again(Y/N)? " );
scanf("%c", &temp);
请注意,现在需要使用&temp调用scanf。如果您不明白原因,请参阅comp.lang.c常见问题解答。使用这种方法
一般来说。scanf非常难以正确使用,更糟糕的是,它的使用难度并不明显
还有几件事:
printf调用后面应该跟着fflushstdout,以确保在等待用户输入时提示是可见的。
您可以比较temp==“Y”等。如果您确实希望temp是字符串字符*而不是单个字符,那么这些比较需要是temp[0]=='Y',等等。
您要求scanf读取字符串,scanf需要一个地址来写入字符串。您为它提供了temp,但temp没有初始化为任何值。您需要为temp分配内存。这可以通过以下方式实现:
char temp[1024];
或
这应该可以修复你的崩溃。但是,1024字节的缓冲区大小是完全任意的,您无法保证用户的输入将适合该缓冲区
在特定情况下,您可以读取单个字符,而不是未知长度的字符串:
char temp;
printf("\nWould you like to play again(Y/N)? " );
scanf("%c", &temp);
请注意,现在需要使用&temp调用scanf。如果您不明白原因,请参阅comp.lang.c常见问题解答。使用这种方法
一般来说。scanf非常难以正确使用,更糟糕的是,它的使用难度并不明显
还有几件事:
printf调用后面应该跟着fflushstdout,以确保在等待用户输入时提示是可见的。
您可以比较temp==“Y”等。如果您确实希望temp是字符串字符*而不是单个字符,那么这些比较需要是temp[0]=='Y',等等。
我应该只使用do和while循环来执行此操作。不能使用循环对不起,我应该指定你似乎也不允许使用家庭作业标签。其他人必须为你这样做。我应该只使用do和while循环。不能使用循环对不起,我应该指定你似乎也不允许使用家庭作业标签。其他人必须为你这么做,谢谢你!只需对您的进行一点修改即可(在do之外声明temp,同时它工作正常!)!一切都很完美,谢谢you@anthony如果此答案解决了您的问题,请选择此答案作为正确答案。如果您将temp声明为char而不是char*,并使用%c而不是%s,则此答案是正确的。事实上,scanf调用仍然是完全错误的,并且在不应该的内存上涂鸦。当然,不管怎样,用scanf都很难避免这样做…@jamesdlin您是对的,先生。我在没有r的情况下重新安排了原始代码
运行它。那会教我。。。我已经改正了我的例子。谢谢!只需对您的进行一点修改即可(在do之外声明temp,同时它工作正常!)!一切都很完美,谢谢you@anthony如果此答案解决了您的问题,请选择此答案作为正确答案。如果您将temp声明为char而不是char*,并使用%c而不是%s,则此答案是正确的。事实上,scanf调用仍然是完全错误的,并且在不应该的内存上涂鸦。当然,不管怎样,用scanf都很难避免这样做…@jamesdlin您是对的,先生。我在没有运行的情况下重新安排了原始代码。那会教我。。。我已经改正了我的例子。