используя getchar() в c, получая ошибку сегментации (дамп ядра)

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

char temp = getchar();
while(temp != '\n'){//input char into temp until '\n'
    input[strlen(input)] = temp;//adds temp to end of input
    temp = getchar();
}

но когда я добираюсь до этой строки в программе, я получаю «Ошибка сегментации (сброс ядра)» и происходит сбой. Когда я заменяю \n другим символом, например, %

char temp = getchar();
while(temp != '%'){//input char into temp until '\n'
    input[strlen(input)] = temp;//adds temp to end of input
    temp = getchar();
}

тогда он работает нормально, но я хочу использовать новую строку, а не %. Я просмотрел несколько руководств, и они сказали, что это как вводить до тех пор, пока не будет нажата клавиша ввода, поэтому я не уверен, в чем проблема. Заранее спасибо.


person tubby    schedule 04.02.2012    source источник
comment
Что такое input и как его инициализировать?   -  person Kerrek SB    schedule 04.02.2012
comment
Вы дружите с художником Шлемиэлем?   -  person Kerrek SB    schedule 04.02.2012


Ответы (3)


Вы можете использовать это:

while ( (temp=getchar()) != EOF && temp != '\n' )

person iPadDevloperJr    schedule 04.02.2012

Проблема здесь:

input[strlen(input)] = temp;

Это может легко привести к переполнению буфера, поскольку нет гарантии, что следующим символом будет '\0', обозначающий конец строки. Вам нужно добавить проверку границ для конца ввода - в нем столько места, и вам нужно сделать следующий символ после temp '\ 0';

Кроме того, как предложил Том, вам обязательно следует изучить использование fgets. (РЕДАКТИРОВАТЬ: извините, я прочитал и набрал gets, но я тоже думал о fgets)

person dbeer    schedule 04.02.2012
comment
Страница руководства для gets() настоятельно рекомендует не использовать его. Если вам нужно, используйте вместо этого fgets(). Вот официальный текст: ОШИБКИ Никогда не используйте gets(). Поскольку невозможно сказать, не зная заранее данных, сколько символов будет считано функцией gets(), и поскольку функция gets() будет продолжать хранить символы после конца буфера, ее использование крайне опасно. Он использовался для взлома компьютерной безопасности. Вместо этого используйте fgets(). - person Bhaskar; 04.02.2012

Вы можете рассмотреть возможность использования fgets, если все, что вы хотите сделать, это прочитать \n. Вот страница об этом.

Вы не должны использовать gets.

person Tom    schedule 04.02.2012