Почему scanf работает неправильно для ввода bool в C? - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь получить данные для 3 переменных bool и 1 переменной int. Даже если я правильно ввожу данные, они не ведут себя правильно.

Я использую %d в качестве спецификатора формата для bool в stdbool.h, как предложено @taufique в Спецификатор формата в scanf для типа данных bool в C

Вот мой код и его поведение:

#include <stdio.h>
#include <stdbool.h>
int main( )
{
    bool health,sex,living;
    int age;
    scanf("%d%d%d%d",&sex,&health,&living,&age);
    printf("\n%d %d %d %d\n",sex,health,living,age);
}

Консоль

0 1 0 25
0 0 0 25

Для некоторых других входных данных:

1 0 0 26
0 0 0 26

Но при использовании временных целочисленных переменных для получения входных данных, предложенных @ouah в том же Спецификатор формата в scanf для типа данных bool в C , он работает нормально.

Так почему же scanf ведет себя некорректно?


PS: он работает правильно для некоторого ввода:

0 0 1 26
0 0 1 26

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Для bool нет спецификатора формата, и иметь его не имеет особого смысла. Что бы пользователь набрал, "true"? Вы не можете использовать %d для любого другого типа, кроме int.

Если вам по какой-то причине нужно взять логический вход из stdin, используйте int значения 1 или 0, а затем преобразуйте его в bool позже. Например:

int living; 
scanf("%d", &living);
bool is_living = living;

Преобразование из int в bool автоматически преобразует любое ненулевое значение в true и ноль в false.

0 голосов
/ 12 июня 2019

Для bool нет спецификатора формата.Потому что для bool не очень понятно, как это должно выглядеть.

Есть много возможностей:

  • да / нет
  • y / n
  • true / false
  • t / f
  • любая другая версия описанного выше случая
  • как насчет местных жителей?
  • 1/0

В отличие от чисел и их разных форматов вышеупомянутые возможности имеют разную семантику.Поэтому поддерживать их всех одним спецификатором нежелательно.

Поэтому, если вы хотите поддержать их, вы должны сами выбрать и реализовать их.

...