Существует проблема приоритета в
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;
}