Проблема новичка с printf и scanf в C - PullRequest
0 голосов
/ 29 марта 2020

У меня проблема с функциями scanf() и printf() во фрагменте кода, подобного следующему:

#include <stdio.h>

int main() {
    int a;
    int b;
    int c;
    scanf("%d %d", &a, &b);
    while (c >= 2) {
        c = a % b;
        a = b;
        b = c;
        printf ("%d\n", c);
    }
    return 0;
}

То, что я ожидаю, происходит в коде моего брата Code :: Block, чтобы программа ожидала ввода от stdin, а затем выводила на stdout результаты, по одному на строку, пока он не достигнет наивысшего общего делителя.

Однако, когда я набираю его в vi и затем скомпилируйте его с помощью gcc и запустите программу из моего терминала, программа корректно принимает входные данные, но завершает работу, не возвращая ничего в stdout.

Если я закомментирую строку scanf() и жестко закодирую любое число с переменными a и b, все работает как положено.

Я пытаюсь выучить C и прочитал основную c документацию по функциям, но не могу помочь чтобы понять этот тип поведения. Я пытался поставить setbuf(stdout, NULL) до объявления переменных, но ничего не изменилось.

Может кто-нибудь дать мне подсказку?

1 Ответ

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

В ваших вызовах scanf и printf нет ничего плохого, но, как уже упоминали другие, одна очевидная проблема заключается в том, что вы проверяете значение неинициализированной переменной (c).

Возможно, вам нужен do { ... } while (...); l oop, а не простой while l oop.

Следующий код гарантирует для выполнить l oop хотя бы один раз , а затем, на конце каждого l oop, проверить, повторять ли это или нет:

#include <stdio.h>
int main() {
    int a;
    int b;
    int c;
    scanf ("%d %d", &a, &b);
    do {
        c = a % b;
        a = b;
        b = c;
        printf ("%d\n", c);
    } while (c >= 2);
    return 0;
}

(В качестве альтернативы инициализируйте c значением >= 2, т.е. используйте объявление: int c = 3;.)

Для дальнейшего обсуждения do .. while l oop см. Здесь: "делай ... пока" против "пока"

...