Почему, когда в моей программе на Си есть 2 оператора scanf, после 1 цикла будет выполняться только один из них? - PullRequest
0 голосов
/ 29 марта 2019
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>

double FindPopulation(char);

void main()
{
    char state;
    double population;
    int flag = 1;

    while(flag == 1) 
{

    printf("This program will display the population for any New England state. \n");

    printf("e=ME, v=VT, n=NH, m=MA, c=CT, r=RI\n");

    printf("Enter the state using the above symbols: ");

    scanf("%c", &state);

    printf("You entered %c \n", state);

    population = FindPopulation(state);

    if (population == 0)
    {
        printf("You have entered a invalid state!\n");
    }

    else

        printf("This state has a population of %.2f million!!\n", population);

    printf("To quit please enter the number 0, to run this program again please enter the number 1: ");

    scanf("%d", &flag);

    }

}

double FindPopulation(char s) 
{

    double pop;

    switch (s)
    {
    case 'e': pop = 1.34;
        break;

    case 'v': pop = 0.63;
        break;

    case 'n': pop = 1.36;
        break;

    case 'm': pop = 6.90;
        break;

    case 'c': pop = 3.57;
        break;

    case 'r': pop = 1.06;
        break;

    default: pop = 0;
    }

    return pop;

}

Я новичок в C, никогда не делал пока циклов в C. В любом случае идея состоит в том, что есть 2 scanf, один из которых запрашивает ввод данных пользователем, чтобы вернуть правильную совокупность состояний, другой scanf будет флагом, который прерывает цикл while. Флаг scanf работает отлично. Если я введу 0, он выйдет из цикла и завершит программу. Если я наберу 1, он продолжит цикл. Однако первый scanf после первого цикла перестанет работать. Он не будет запрашивать ввод другого пользователя. Вместо этого он пропустит себя и напечатает вывод:

"Enter the state using the above symbols: You entered "

Для второго сканирования я могу нажать 0, чтобы выйти в любое время, даже после нескольких итераций.

Может кто-нибудь сказать мне, почему один scanf работает правильно, а другой выходит из строя?

1 Ответ

1 голос
/ 29 марта 2019

Когда вы впервые получаете ввод символов в переменную state, используя scanf, он сохраняет его в state. Затем вы получаете ввод для пометки, используя scanf. Если вы нажмете клавиши 0 и Enter, 0 (int) будет сохранено во флаге, а \n останется таким же, как в файле stdin.

Следующий scanf получает символ (% c) из стандартного ввода (стандартный входной файл), и, поскольку \n является первым символом в вводе стандартного ввода, он помещает \n в state. Поскольку ваша функция FindPopulation() не принимает \n в качестве допустимого значения, она отображает ошибку.

Вы можете решить эту проблему, поставив getchar(); после scanf("%d", &flag);.
getchar(); получает символ из стандартного ввода, т.е. удаляет \n из стандартного ввода.
Вы также можете использовать while((c = getchar()) != '\n' && c != EOF); чтобы удалить все символы в stdin.

...