как создать динамический массив размером с получаемую строку С++
В консоль вводится строка, размер которой заранее неизвестен. Как можно создать динамический массив размером с получаемую строку? Нельзя использовать 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 на длинных строках.