getchar() пропускает все остальные символы в C

У меня были проблемы с полным использованием getchar() некоторое время в C. И в этом случае я пытаюсь прочитать строку и поместить символы строки в массив. Однако при назначении getchar() массиву он пропускает некоторые символы.

Например, ввод «Он пропускает все остальные», вывод будет... I\n \n k\n p\n \n v\n r\n \n t\n e\n. (\n просто представляет новую строку.)

int N = 0;

char message[80] = {};

do
{
    message[N] = getchar();
    N++;
    printf("%c\n", message[N-1]);
}
while(getchar() != '\n');

Спасибо за ваше время, как уже говорилось ранее, почти каждый раз, когда я когда-либо пытался использовать getchar(), это всегда давало какой-то неожиданный результат. Я не совсем понимаю, как функция читает символы.


person Trevor    schedule 27.02.2013    source источник
comment
Вы вызываете getchar() дважды каждый раз в цикле.   -  person par    schedule 27.02.2013
comment
остановитесь в отладчике и проверьте message   -  person Mawg says reinstate Monica    schedule 27.02.2013
comment
У @par есть ответ. И должен опубликовать это как таковое.   -  person Mawg says reinstate Monica    schedule 27.02.2013


Ответы (2)


Вы вызываете getchar() дважды, один раз в условии while, а другой внутри тела do-while.

Вместо этого попробуйте этот код:

int N = 0;
#define MAX_SIZE 80

char message[MAX_SIZE] = {};
char lastChar;

do
{
    lastChar = getchar();  
    if (lastChar == '\n')
        break; 
    message[N] = lastChar;
    N++;
    printf("%c\n", message[N-1]);
}
while(N < MAX_SIZE);

ОБНОВЛЕНИЕ: добавлены проверки максимального размера массива вместо использования бесконечного цикла do-while.

person Tuxdude    schedule 27.02.2013
comment
Добавьте некоторые проверки, чтобы убедиться, что N < 80. Мы хотим избежать переполнения буфера :) - person nneonneo; 27.02.2013

Вы вызываете getchar() дважды каждый раз в цикле. Каждый раз, когда вы вызываете getchar(), он потребляет один символ. Поэтому вместо вызова getchar() в вашем условии while( ... ) сравните значение message[N] с символом новой строки.

person par    schedule 27.02.2013