getchar vs scanf: почему не работает getchar? - PullRequest
1 голос
/ 05 февраля 2020

Я написал простую программу для ввода числа и возврата любого значения, которое при делении на него вернет остаток 3.

В настоящее время я читаю K & R, и он не учит scanf, пока что-то вроде Глава 7, поэтому я попытался использовать getchar. Это не работает, но Scanf делает. Что я делаю не так?

int main()
{
    int c, i;

    printf("Input an integer: ");
    //c = getchar();
    scanf("%d", &c);

    for (i = 1; i <= 100; i++) {
        if ((i % c) == 3) {
            printf("%d\n", i);
        }
    }
    return 0;
}

Необязательный дополнительный вопрос: Кажется, что люди здесь советуют не начинать с K & R. Что может быть лучшей альтернативой для начинающего?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Это:

scanf("%d", &c);

Запрашивает scanf() для чтения целочисленного значения со стандартного ввода. Функция scanf() будет считывать со стандартного ввода столько символов, сколько необходимо, а затем анализирует их в целое число, сохраняя значение в переменной c (т.е. по адресу, указанному &c) , Возвращаемое значение scanf() также указывает количество правильно проанализированных элементов, поэтому в этом случае вам следует проверить, является ли возвращенное значение 1.

Это:

c = getchar();

Is запрос getchar() для чтения одного символа из стандартного ввода. Функция getchar() попытается прочитать символ и вернет его (приведенный к int) в случае успеха. В случае ошибки или конца файла будет возвращено специальное целочисленное значение EOF. Тот факт, что getchar() возвращает int, не означает, что функция будет анализировать ввод, как scanf("%d", ...). Действительно, возвращаемое значение имеет тип int только потому, что необходимо отличать guish действительный символ от EOF.

Чтобы узнать больше, см. Справочные страницы для scanf и getchar с помощью команды man, например man scanf. Обращаясь к страницам справочника, важно понимать семантику функции. Всегда читайте инструкцию . Кроме того, вы можете посмотреть его онлайн: scanf(), getchar().


Если вы хотите отсканировать один символ используя getchar() и преобразовать его в целое число, затем вы можете сделать следующее:

#include <stdio.h>  // getchar(), puts()
#include <ctypes.h> // isdigit()

int main(void) }
    int c;

    c = getchar();
    if (c == EOF) {
        puts("Error!");
        return 1;
    }

    if (!isdigit(c)) {
        puts("Character is not a digit!");
        return 1;
    }

    int value = c - '0';
    // value now holds the integer corresponding to the digit that was read from input

    /* ... */

    return 0;
}

Примечание: c - '0' работает, потому что символы, представляющие цифры, имеют последовательно увеличивающиеся значения в таблице ASCII (от 0x30 до 0x39). Смотрите также man ascii.

0 голосов
/ 05 февраля 2020

getchar читает один символ из входного потока и возвращает его как целочисленное значение его внутреннего представления или EOF.

Таким образом, чтобы прочитать число, которое имеет по крайней мере две цифры, вам нужно вызвать getchar несколько раз, а затем преобразовать представления символов в соответствующее целое число.

Напротив getchar scanf пытается прочитать целое число как целое число, если вы указали формат преобразования %d или аналогичный, специально разработанный для чтения чисел

Вот демонстрационная программа, которая показывает, как ваша программа может быть реализована с использованием getchar. В программе нет проверки, вводил ли пользователь слишком большое число. Вы можете добавить такую ​​проверку самостоятельно.

#include <stdio.h>
#include <ctype.h>

int main(void) 
{
    const unsigned int REMAINDER = 3;

    printf( "Input a non-negative integer: " );

    unsigned int n = 0;

    for ( int c; ( c = getchar() ) != EOF && isdigit( ( unsigned char )c ); )
    {
        const unsigned int Base = 10;

        n = Base * n + ( c - '0' );
    }


    if ( n > REMAINDER )
    {
        const unsigned int N = 100;
        for ( unsigned int i = 0; i < N; i++ )
        {
            if ( ( i + 1 ) % n == REMAINDER ) printf( "%u ", i + 1 );
        }
        putchar( '\n' );
    }

    return 0;
}

Вывод программы может выглядеть, например, как

Input a non-negative integer: 10
3 13 23 33 43 53 63 73 83 93 

Что касается книг, то всегда трудно читать книгу на каком-либо языке или технология, с которой вы еще не знакомы.

...