Динамические строки, их ввод

Пытаюсь придумать, как заполнить строку (динамически выделенную) неизвестной длины с консоли.

Вот к чему я пришел:

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 шт):

Автор решения: Harry
  1. Все же realloc для каждого символа (а работа с памятью довольно дорогостояща в плане эффективности) вариант тяжелый. Может, задуматься о, например, удвоении памяти, если ее не хватает?

  2. Что значит getchar() остановился? Вы ввели строку, она пошла в буфер ввода, пошло считывание, последний введенный символ \n, работает break. Все, как вы попросили. Приступайте к новому чтению очередной строки.

  3. Мусор будет находиться и при вызове malloc, например. Выделенная память не очищается, если только вы не сделали это самостоятельно или не вызвали специальную функцию выделения с очисткой, как это сделано у вас.

  4. Нулевой символ в Windows вводится в строку точно так же, как и в любой другой операционной системе — присваиванием типа str[i] = '\0' или просто str[i] = 0.

→ Ссылка