Проблема вывода строки методом цикла по символам на Си
#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 шт):
Я считаю, что ошибка заключается в 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
}