почему scanf не читает ноль - PullRequest
1 голос
/ 27 мая 2020

Я действительно новичок ie. Я использую scanf для чтения из ввода и присвоения его переменной. Когда я печатаю переменную, она печатает 1 вместо нуля. Это мой код:

#include <stdio.h>

int main()
{
   int a = scanf("%d", &a);
   printf("%d", a);

   return 0;
} 

Ответы [ 3 ]

3 голосов
/ 27 мая 2020

scanf возвращает 1 как успех:

int a = scanf("%d", &a);

Измените это на:

int a;
scanf("%d", &a);
2 голосов
/ 27 мая 2020

Вы должны использовать что-то вроде:

#include <stdio.h>

int main(void)
{
    int a;
    int n = scanf("%d", &a);
    if (n != 1)
    {
        fprintf(stderr, "Failed to read an integer (%d)\n", n);
        return 1;
    }
    printf("%d\n", a);

    return 0;
}

Переменная n позволяет вам различать guish между EOF (обычно -1) и "первые данные после пробела не является частью целого числа "(n будет содержать 0). Обратите внимание, что сообщение об ошибке печатается при стандартной ошибке; вот для чего это нужно. Обычно вы должны печатать новую строку в конце выходных сообщений.

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

#include <stdio.h>

int main(void)
{
    int a;
    if (scanf("%d", &a) != 1)
    {
        fprintf(stderr, "Failed to read an integer\n");
        return 1;
    }
    printf("%d\n", a);

    return 0;
}

Это все еще важно проверить результат от scanf(), чтобы, если пользователь набрал zero вместо 0, вы могли определить проблему.

Обратите внимание, что a не будет назначен, если сопоставление не удается - поэтому без теста вы бы распечатали неинициализированную переменную, что не является хорошей идеей. Вы можете определить int a = 0;, чтобы избежать этой проблемы (с любым выбором инициализатора int, который вам нравится).

2 голосов
/ 27 мая 2020

int a = scanf("%d", &a); определяет a для инициализации возвращаемым значением scanf и просит scanf поместить преобразованное значение в a. Это не верно. Используйте:

int a;
scanf("%d", &a);

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

...