Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
再次播放功能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 - Fatal编程技术网

再次播放功能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 我有一个家庭作业,基本上是用用户输入来创建一个高尔夫球游戏,询问要打多少个洞,每个洞有多少个洞,然后随机地生成那个人在那个洞上的东西,然后把它打印出来。最后,它要求用户重新播放,输入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循环或dowhile循环来完成这项工作感到困惑。这是可行的,但当我运行程序并必须输入是或否时,我键入的任何内容都会导致程序突然崩溃。我不知道该怎么办。 基本上,我希望用户输入一些东西,如果是的话,再次玩整个游戏,如果不是,结束循环,如果是其他东西,给他们一个错误并再次提示他们。感谢您今晚的帮助!:/谢谢

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您是对的,先生。我在没有运行的情况下重新安排了原始代码。那会教我。。。我已经改正了我的例子。