как создать динамический массив размером с получаемую строку С++

В консоль вводится строка, размер которой заранее неизвестен. Как можно создать динамический массив размером с получаемую строку? Нельзя использовать string, только массивы char.


Ответы (2 шт):

Автор решения: Harry

Держите в честь праздника :)

char * read()
{
    int sz = 8, i = 0;
    char * buf = malloc(sizeof(char)*sz);
    for(int c = fgetc(stdin); c != EOF && c != '\n'; c = fgetc(stdin))
    {
        buf[i++] = c;
        if (i == sz)
        {
            sz *= 2;
            buf = realloc(buf,sz);
        }
    }
    buf[i] = 0;
    return buf;
}

Полный код - https://ideone.com/kgX4Nb

→ Ссылка
Автор решения: Maxim Timakov

Вариант с одним выделением динамической памяти:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <memory>

char* read_line(FILE* input);

int main() {
    std::unique_ptr<char[]> str;
    
    str.reset(read_line(stdin));
    
    std::cout << "read: [" << str.get() << "]" << std::endl;
    
    return 0;
}
char* read_impl(FILE* input, size_t size, int ch);

char* read_line(FILE* input)
{
    return read_impl(input, 0, fgetc(input));
}

char* read_impl(FILE* input, size_t size, int ch)
{
    char* str;
    if (ch == EOF || ch == '\n')
    {
        str = new char [size + 1];
        str[size] = '\0';
    }
    else
    {
        str = read_impl(input, size + 1, fgetc(input));
        str[size] = char{ch};
    }
    return str;
}

Результат

ВНИМАНИЕ: может вызвать StackOverflow на длинных строках.

→ Ссылка