Проблема вывода строки методом цикла по символам на Си

#include <stdio.h>

void input(char *text) {
  int i = 0;
  for(int c = getchar(); c != EOF; c = getchar()) {text[i] = c; i++;}
}

void print(char *text) {
  for(int i = 0; text[i] != EOF; i++) {putchar(text[i]);}
}

int main() {
  char in[50];
  input(in);
  print(in);
}

Ввод input работает, но цикл вывода по символьно работает сумасшедше: выводит лишь первый символ, бывает два или три, не знаю от чего это зависит. Пробовал выводить без цикла, просто написал 5 раз:

printf("%c", x[1..5])

введите сюда описание изображения

результат такой-же — неудачный. Написал:

printf("%c%c%c%c%c%c%c%c%c%c", x[0], x1, x[2], x[3], x[4], x[5])

в этот раз вывелось всё правильно. Проблему я решил, помимо %c существует %s, но кто знает, с чем связанно то, что при цикле вывода каждого символа выводит один-три символа??

До этого, писал однострочный импут и ввод, тут проблем не было:

void print_str(char *text) {
    for(int x = 0; text[x] != '\n'; x++) {printf("%c", text[x]);}
}

void input_str(char *text) {
    int len=0;
    for (char a; a != '\n'; len++) {
        scanf("%c", &a);
        text[len] = a;
    }
}

Если кто-то знает, почему так работает, объясните или дайте сурс где описана данная ситуация, пытался разобраться сам, не понимаю..


Ответы (1 шт):

Автор решения: Calcium-X

Я считаю, что ошибка заключается в EOF, который работает очень странно, недавно, писал код по счёту количества символов в вводе и проверка на EOF препятствовала последующему циклу:

while ((c = getchar()) != 'EOF') {
    ...
} 
for(int i = 0; i < 26; i++) {...} 

В итоге цикл выводился лишь один раз, но стоило мне сменить 'EOF' на '\n' и проблема решилась, цикл заработал, всё стабильно, ещё наткнулся на интересную статью на хабе, кому интересно, прочитаете.

Хочу сказать спасибо тем, кто пытался мне помочь, я почти сразу нашёл ответ и заключается он в том, что в Си существует помимо %c (вывода символа) %s (вывода строки) и, почему-то, вывод строки по-символьно работал некорректно из-за EOF-а.

FrancNet предположил, что нужно передавать не только список, но и количество символов, но этого не нужно, если в конце строки есть '\0'. А вот и та самая функция:

void input(char *text) {
    int i = 0;
    //for(int c = getchar();(c != EOF & c != '\n'); c = getchar()) {text[i] = c; i++;}
    //text[i] = '\0';
    for(int c = getchar();c != EOF; c = getchar()) {text[i] = c; i++;}
    text[i-1] = '\0';  // If last char == \n i fix this
}
→ Ссылка