Делай пока цикл повторяется в Си - PullRequest
2 голосов
/ 29 марта 2012

ПРОБЛЕМА Я набираю y в качестве опции, и он печатает текст дважды, прежде чем запрашивать меня снова, когда он должен печатать его только один раз.

ПРАВИЛЬНЫЙ ВЫХОД (что я должен получить, но не получить):

Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)

Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)

Do you order FISH (Y/N)? n

Do you order CHIPS (Y/N)? n

Do you order DRINKS (Y/N)? y
Drinks choice (S- Softdrink, C- Coffee, T- Tea)

Do you order DRINKS (Y/N)? n

НЕПРАВИЛЬНЫЙ ВЫХОД (вывод, который я получаю)

Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? y
Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? Fish choice (K- Haddock, T- Halibut)
Do you order FISH (Y/N)? n
Do you order CHIPS (Y/N)? Chips choice (C- Cut, R- Ring)
Do you order CHIPS (Y/N)? n
Do you order DRINKS (Y/N)? Drinks choice (S- Softdrink, C- Coffee, T- Tea):
Do you order DRINKS (Y/N)? n

RAW SOURCE (в случае, если вы хотите скомпилировать его самостоятельно и проверить, что происходит): http://pastebin.com/raw.php?i=mZ1jVrF0

ИСТОЧНИК

#include <stdio.h>
#include <string.h>

int main() {

    char fishYesNo, chipsYesNo, drinksYesNo;
    char *typeOfFood;

    do {
        typeOfFood = "fish";
        printf("Do you order FISH (Y/N)? ");
        scanf("%c", &fishYesNo);
        if (fishYesNo != 'n') {
            printf("Fish choice (K- Haddock, T- Halibut) \n");

        }
        else if (fishYesNo == 'n') {
            typeOfFood = "chips";
        }

    } while ((strcmp(typeOfFood, "fish")) == 0);

    do {
    typeOfFood = "chips";
        printf("Do you order CHIPS (Y/N)? ");
        scanf("%c", &chipsYesNo);
        if (chipsYesNo != 'n') {
            printf("Chips choice (C- Cut, R- Ring) \n");
        }
        else if (chipsYesNo == 'n') {
            typeOfFood = "drinks";
        }

    } while ((strcmp(typeOfFood, "chips")) == 0);

    do {
    typeOfFood = "drinks";
        printf("Do you order DRINKS (Y/N)? ");
        scanf("%c", &drinksYesNo);
        if (drinksYesNo != 'n') {
            printf("Drinks choice (S- Softdrink, C- Coffee, T- Tea):\n");
        }
        else if (drinksYesNo == 'n') {
            typeOfFood = "fish";
        }

    } while ((strcmp(typeOfFood, "drinks")) == 0);

}

1 Ответ

6 голосов
/ 29 марта 2012

Это общеизвестная концептуальная ошибка в C. Часто задаваемые вопросы comp.lang.c (которые я предлагаю вам прочитать) содержит много информации об этом и других ошибках.

Объяснение того, что происходит в вашем коде ( comp.lang.c Список часто задаваемых вопросов · Вопрос 12.18b ):

Вы хотели scanf %c прочитать один символ, и он попытался, но когда вы пытались набрать этот единственный символ на нем, до остального система ввода примет это, вы должны были также нажать клавишу RETURN. scanf читать только один символ, но этот дополнительный символ новой строки был все еще сидит где-то во входном буфере, и это лишняя новая строка (по-видимому, представляющий фантомную пустую строку), который был получен Ваш последующий входящий вызов.

Как с этим справиться, из обзора проблем scanf (список часто задаваемых вопросов comp.lang.c · Вопрос 12.20 ):

Почти невозможно изящно справиться со всеми этими возможностями проблемы при использовании scanf; гораздо проще читать целые строки (с fgets или т.п.), затем интерпретируйте их, используя sscanf или другие техники.

...