Динамические строки, их ввод
Пытаюсь придумать, как заполнить строку (динамически выделенную) неизвестной длины с консоли.
Вот к чему я пришел:
str = (char*)calloc(1, 1);
c2 = 0;
while (1==1)
{
sim = getchar();
if (sim != '\n')
str[c2] = sim;
else
break;
c2++;
str = (char*)realloc(str, c2+1);
}
str - строка для ввода
т.е я читаю посимвольно и выделяю память для каждого символа, который перед помещением в строку храниться в sim.
В итоге getchar() остановился на \n, что печально, ведь я хотел еще считать неопределенное количество строк и записывать в массив строк. Можно использовать string, но меня интересует чистый Си.
И второй момент: когда я выделяю память под строку в ней находиться какой-то мусор!! Хотя я делал так - str = new char[0 или 1];
Хрень какая-то. Можете помочь с решением двух проблем. Заранее спасибо
И еще, как ввести символ нулевой строки(признак конца строки) в Windows?
Ответы (1 шт):
Все же
reallocдля каждого символа (а работа с памятью довольно дорогостояща в плане эффективности) вариант тяжелый. Может, задуматься о, например, удвоении памяти, если ее не хватает?Что значит
getchar()остановился? Вы ввели строку, она пошла в буфер ввода, пошло считывание, последний введенный символ\n, работаетbreak. Все, как вы попросили. Приступайте к новому чтению очередной строки.Мусор будет находиться и при вызове
malloc, например. Выделенная память не очищается, если только вы не сделали это самостоятельно или не вызвали специальную функцию выделения с очисткой, как это сделано у вас.Нулевой символ в Windows вводится в строку точно так же, как и в любой другой операционной системе — присваиванием типа
str[i] = '\0'или простоstr[i] = 0.