преобразование String.data () в массив - PullRequest
0 голосов
/ 17 сентября 2010

Я хочу взять строку и заполнить массив ее значениями. Я знаю, что длина строки 16. Я пробовал

char *bit_number[16];
bit_number = bin.data();

и

char bit_number[16];
bit_number = bin.data();

Я не понимаю, что возвращает String.data (), почему я не могу назначить его непосредственно массиву? Я получаю ошибки компилятора:

error: incompatible types in assignment of ‘const char*’ to ‘char* [16]’

и

error: incompatible types in assignment of ‘const char*’ to ‘char [16]’

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Вам необходимо скопировать содержимое:

Предполагая, что bin является std::string:

char bit_numer[16];
copy( bin.begin(), bin.end(), bit_number );

Однако это все виды рисков.Что если ваш bin имеет 17 символов?

Кстати, ваш оригинальный код:

char *bit_number[16];

... не выделяет массив из 16char с, как вы можете ожидать.Выделено массива 16 char*.Скорее всего, не то, что вы хотите.

1 голос
/ 18 сентября 2010

Для чего вообще нужен этот массив char?И ты уверен, что то, что есть в тебе, вписывается в это?(Существует целый класс ошибок, возникающих при использовании массивов, и известный также: переполнения буфера.) Скорее всего, вам гораздо лучше использовать std::vector, который динамически изменяет размер:

std::vector<char> v( bin.begin(), bin.end() );

Если вам нужен массив для передачи его в функцию API C, которая не знает, как обрабатывать std::vector, вы можете получить доступ к базовому массиву вектора, выполнив несколько загадочных &v[0] или &*v.begin().(Помните, что вы должны проверить, не является ли вектор пустым, прежде чем получить доступ к своему первому элементу таким образом.)

1 голос
/ 17 сентября 2010

Вы можете использовать std::string::c_str(), чтобы получить доступ к массиву символов, а затем использовать strcpy, чтобы переместить его в новый массив.

string s = "1234";
char arr[5] = { 0 };
strcpy(arr, s.c_str());
1 голос
/ 17 сентября 2010

Если вы хотите, чтобы массив dest заканчивался нулем, это дополнительная строка кода и, возможно, дополнительный байт в целевом массиве для его размещения.

В вашем первом примере у вас есть массив из 16 указателей на символ. Это не то, что вы хотите.

Во втором примере у вас есть правильные типы, но вы не можете назначить указатель (возвращаемый из data ()) непосредственно на массив, потому что их типы несовместимы - вы должны скопировать ссылочные данные из одного места в другое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...