играть снова функцию с - PullRequest
       15

играть снова функцию с

0 голосов
/ 21 февраля 2012

У меня есть домашнее задание, которое в основном принимает пользовательский ввод для создания игры в гольф, спрашивая, сколько лунок нужно сыграть, каков размер каждой лунки, и случайным образом генерирует, что человек получил в этой лунке, и распечатывает ее. в конце он просит пользователя сыграть снова, введите 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. Это работает, но когда я запускаю программу и дохожу до точки, где мне нужно ввести да или нет, все, что я ввожу, вызывает внезапный сбой программы. и я не знаю что делать. в основном, я хочу, чтобы пользователь что-то ввел, и если да, играйте всю игру снова, если нет, завершите цикл, а если что-то еще, дайте им ошибку и предложите снова. любая помощь ценится сегодня вечером! : / спасибо

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012
while (temp != 'y' || temp != 'Y' || temp != 'n' || temp != 'N') {

temp не может быть всеми 4 одновременно, поэтому всегда будет иметь значение true, измените его на &&

1 голос
/ 21 февраля 2012
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. (Если вы не понимаете почему, см. Q12.12 и Q12.12b в FAQ по comp.lang.c.) Однако остерегайтесь новой строки, оставленной в входной буфер с использованием этого подхода.

В общем, лучше всего избегать scanf полностью . scanf невероятно сложно правильно использовать (и, что еще хуже, не очевидно, что его трудно использовать).

Несколько других вещей:

  • После вызова printf следует fflush(stdout), чтобы убедиться, что подсказка видна при ожидании ввода пользователя.
  • Вы сравниваете temp == 'Y' и такие. Если вы намереваетесь, чтобы temp была строкой (char*) вместо одного char, тогда эти сравнения должны быть temp[0] == 'Y' и т. Д.
1 голос
/ 21 февраля 2012

Посмотрите на ваши выражения 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');
}
0 голосов
/ 21 февраля 2012

Позвольте мне помочь вам немного привести в порядок петли. Извлеченный урок: ибо () твой друг ...

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++) {. Но помните: это нестандартная идиома. Подсчет обычно начинается с нуля.

...