Печать номеров с использованием getchar - PullRequest
0 голосов
/ 20 марта 2020

Итак, моя проблема в том, что я хочу напечатать число, используя функцию getchar, и если я введу 101, то результат будет 101, но вместо этого я получу 11 в качестве ввода и 0 игнорируются, пока они находятся внутри номера.

Код:

#include <stdio.h>

#define Out  0
#define In   1

void ex04();

int main() {
    ex04();
    return 0;
}

void ex04() {
    int c;
    while ((c = getchar()) != EOF) {
        int state = Out;
        if (state == Out && c != '0' && c != '\n' && c != '\t' && c != ' ') {
            state = In;
            printf("%c", c);
        } else
        if (state == In && c == '0') {
            State = In;
            printf("%d", 0);
        } else
        if (state == Out && c == '0' || c == '\n' || c == '\t' || c == ' ') {
            state = Out;
        } else
        if (state == In && c == '\n' || c == '\t' || c == ' ') {
            state = Out;
        }
    }
}

Пример:

Ввод: 101

Мой вывод: 11

Правильный вывод: 101

Ввод: 1 2 0 4

Мой вывод: 1 2 4

Правильный вывод: 1 2 0 4

Ввод: 0

Мой вывод:

Правильный вывод: 0

Действительно любая помощь будет оценена и, кстати, я не может использовать scanf.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Если вы хотите этот вывод, просто измените эту строку if (state == In && c == '0') на if (state == Out && c == '0'), потому что ваш state будет out после каждого раза, когда вы go будете первым из l oop, когда вы что-то инициализируете внутри al oop, каждый раз, когда вы пересекаете al oop и go до первого значения, значение этой переменной снова становится инициализированным значением. поэтому проверка if(state==out) означает меньше. (в вашем случае, не везде)

Для каждого символа ваше состояние будет отсутствовать, просто удалите его, используя его как if(out==out) (поэтому ваша программа никогда не печатает 0, потому что state==out для каждого символа, включая 0.)

посмотрите

#include <stdio.h>


void ex04();

int main() {
    ex04();
    return 0;
}

void ex04() {
    int c;
    while ((c = getchar()) != EOF) {
        if (c != '0' && c != '\n' && c != '\t' && c != ' ') {

            printf("%c", c);
        }
        else
            if ( c == '0') {

                printf("%d", 0);
            }
            else
                if (c == '0' || c == '\n' || c == '\t' || c == ' ') {

                    //  printf("\n");
                }
                else
                    if ( c == '\n' || c == '\t' || c == ' ') {

                        //  printf("\n");
                    }

    }
}

те printf (которые я прокомментировал) помогут вывести читабельность.

0 голосов
/ 20 марта 2020

Существует проблема приоритета в

if (state == Out && c == '0' || c == '\n' || c == '\t' || c == ' ')

Вы, вероятно, имеете в виду:

if (state == Out && (c == '0' || c == '\n' || c == '\t' || c == ' '))

То же самое относится и к последнему тесту.

Вы должны вероятно, переместите int state = Out; за пределы l oop.

Наконец, я не уверен, почему вы используете специальный случай 0 в тестах, но эти исправления действительно меняют поведение.

Вот модифицированная версия:

#include <stdio.h>

#define Out  0
#define In   1

void ex04(void) {
    int c;
    int state = Out;
    while ((c = getchar()) != EOF) {
        if (state == Out && c != '0' && c != '\n' && c != '\t' && c != ' ') {
            state = In;
            printf("%c", c);
        } else
        if (state == In && c == '0') {
            state = In;
            printf("%d", 0);
        } else
        if (state == Out && (c == '0' || c == '\n' || c == '\t' || c == ' ')) {
            state = Out;
        } else
        if (state == In && (c == '\n' || c == '\t' || c == ' ')) {
            state = Out;
        }
    }
}

int main() {
    ex04();
    return 0;
}
...