Строка в уникальный массив указателей - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь преобразовать строку в массив unique_ptr в c ++, но при использовании strcpy () я получаю сообщение об ошибке, вот что я сделал

int arraysize{0},i{0};
std::string word; 

std::cout<<"Input size of array: ";
std::cin>>arraysize;
std::cin.get();
std::unique_ptr<char[]>ch_array(new char[arraysize]);

std::cout<<"Input a word: ";
getline (std::cin, word);
strcpy(ch_array,word);

Я хочу получитьслово и преобразовать его в массив символов, чтобы проверить, палиндром это или нет.Также мне нужно использовать только массив символов, созданный с использованием умных указателей, потому что я новичок в c ++ и пытаюсь практиковать умные указатели.

Ошибка: q3.cpp: In function 'int main ()': q3.cpp: 17: 22: ошибка: невозможно преобразовать' std :: unique_ptr 'в' char * 'для аргумента' 1 'в' char * strcpy (char *, const char *) 'strcpy (ch_array, word);

Любые предложения будут полезны.спасибо!

1 Ответ

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

Сообщение об ошибке не требует пояснений.Вы передаете std::unique_ptr, где ожидается char*.std::unique_ptr<char[]> неявно преобразуется в char*.Вам необходимо вызвать метод get(), чтобы получить указатель char* на выделенную память.

Кроме того, strcpy() ожидает и создает строку C с нулевым символом в конце.Но вы ничего не делаете для того, чтобы данные word вписывались в пределы указанного arraysize.

Попробуйте вместо этого:

int arraysize{0};
std::string word;

std::cout << "Input size of array: ";
std::cin >> arraysize;
std::cin.ignore();

std::unique_ptr<char[]> ch_array(new char[arraysize+1]);
// or:
// auto ch_array = std::make_unique<char[]>(arraysize+1);

std::cout << "Input a word: ";
getline(std::cin, word);

strncpy(ch_array.get(), word.c_str(), arraysize);
// or:
// std::copy(word.begin(), word.end(), ch_array.get());
ch_array[arraysize] = '\0';

В качестве альтернативы, вообще не спрашивайте у пользователя arraysize, просто используйте вместо него собственный размер word:

std::string word;
size_t arraysize;

std::cout << "Input a word: ";
getline(std::cin, word);

arraysize = word.size();

std::unique_ptr<char[]> ch_array(new char[arraysize+1]);
// or:
// auto ch_array = std::make_unique<char[]>(arraysize+1);

strncpy(ch_array.get(), word.c_str(), arraysize);
// or:
// std::copy(word.begin(), word.end(), ch_array.get());
ch_array[arraysize] = '\0';
...