再玩一次功能c

时间:2012-02-21 00:18:57

标签: c function while-loop do-while

我有一个家庭作业,基本上需要用户输入来创建一个高尔夫游戏,询问要玩多少个洞,每个洞的标准,并随机生成该人在那个洞上得到的东西,并将其打印出来。最后,它要求用户再次播放,输入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的程度时,我输入的任何内容都会导致程序突然崩溃。而且我不知道该怎么做。 基本上,我希望用户输入一些内容,如果是,则再次播放整个游戏,如果不是,则结束循环,如果是其他内容,则给出错误并再次提示。任何帮助表示赞赏今晚到期! :/谢谢

4 个答案:

答案 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.12Q12.12b。)However, beware of the newline left in the input buffer使用此方法。

一般来说,it's best to avoid scanf entirelyscanf非常难以正确使用(更糟糕的是,使用起来并不明显)。

其他一些事情:

  • 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++) {。但请记住:那是非标准的习语。正常计算 从零开始。