Динамическое выделение символьного массива (Smart Pointers) - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь динамически выделить массив символов в c ++, используя умные указатели на основе пользовательского ввода, например

std::cout<<"Input a word: ";
std::cin>>std::unique_ptr<char[]>ch_array(new char[]);

Поэтому, когда пользователь вводит строку, он потребляет только необходимое количество байтов.Так как он продолжает давать мне ошибку, есть ли другой обходной путь для достижения таких результатов?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Если вы не хотите использовать std :: string или любые другие стандартные контейнеры, как если бы было предложено ранее, у вас есть два основных варианта:

Прямой один - выделить буферзаранее, достаточно большой, чтобы хранить входные данные

std::cout << "Input a word: ";
char ch_array[100];
std::cin >> ch_array;

Гораздо сложнее - прочитать ввод по символу и перераспределить память

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

char* ch_array;
static int count = 0;
char c = getchar();

while(c != '\n')
{
    if( count == 0)
        ch_array = static_cast<char*>( malloc( sizeof(char)+1 ) );
    else
        ch_array = static_cast<char*>( realloc(ch_array, sizeof(char)*(count+2) ) );

    ch_array[count] = c;

    count++;
    c = getchar();
}
ch_array[count] = '\0';

В этом коде также пропускаются проверки ошибок, которые абсолютно необходимы для перераспределения.С ними будет еще сложнее

Что касается умного указателя , который есть в названии, но, похоже, не имеет отношения к вопросу:

С первой опцией вы можете выделить буфер в куче и использовать его:

std::unique_ptr<char[]> ch_array(new char[100]);

Со вторым вам нужно пользовательское удаление, как описано здесь Можно ли использовать умные указатели C ++вместе с malloc С?

0 голосов
/ 10 октября 2018

Несколько проблем:

  • У вас не может быть массива неизвестного размера, вы всегда должны создавать его с размером.
  • Вы не можете объявлять или определять переменныево всех контекстах, как часть универсального выражения.
  • A std::unique_ptr объект по-прежнему является std::unique_ptr объектом, нет встроенного оператора преобразования для преобразования в указанный тип, что означает, что он можетне может использоваться непосредственно в качестве адресата для оператора форматированного ввода.
...