Есть ли проблема при чтении символа, который находится внутри струк? - PullRequest
0 голосов
/ 26 апреля 2019

Итак, у меня есть этот код, и по какой-то причине, когда я пытаюсь ввести всю «запрошенную» информацию, моя программа всегда пропускает сканирование символа

В настоящее время я решил эту проблему, создав переменную типа char с массивом на 1 позицию и рассматривая ее как строку, но не имеет смысла, почему она не будет читать char

struct person
{
    char name[30];
    int age;
    char sex;
};

int main()
{
    struct person data[3];

    for (i = 0 ; i < 3 ; i++)
    {
        printf("\nType in the data of the person number: %d",i+1);
        printf("\nName: ");
        scanf("%s",data[i].name);
        printf("\nAge: ");
        scanf("%d",&data[i].age);
        printf("\nSex (M/F): ");
        scanf("%c",data[i].sex);
    }
}

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

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Читается char, но это символ новой строки '\n' слева от предыдущего scanf(). Чтобы пропустить первые пробелы, используйте

scanf(" %c", &data[i].sex);
//     |
//     +---- skips leading whitespace

И вы также пропустили адрес оператора в вашем коде.

Для большинства спецификаторов формата, таких как %d, начальный пробел не требуется, поскольку по умолчанию они пропускают начальные пробелы.

0 голосов
/ 26 апреля 2019

В вашем входном потоке есть символ новой строки, который читается как символ (%c), который вы пытаетесь прочитать как пол.

Вы можете прочитать этот символ и игнорировать его таким образом:

        printf("\nSex (M/F): ");
        getchar();  //ignore the remained character in input stream
        scanf("%c", &data[i].sex);

Как уже упоминалось в других ответах, вы также забыли символ ссылки (&) при сканировании пола.

...