Установить массив символов с помощью c_str ()? - PullRequest
3 голосов
/ 07 мая 2011
char el[3] = myvector[1].c_str();

myvector[i] - строка с тремя буквами. Почему возникает эта ошибка?

Ответы [ 5 ]

5 голосов
/ 07 мая 2011

Возвращает тип char *, который является указателем на строку. Вы не можете назначить это напрямую такому массиву, так как этому массиву уже назначена память. Попробуйте:

const char* el = myvector[1].c_str();

Но очень осторожно, если сама строка уничтожена или изменена, поскольку указатель больше не будет действительным.

2 голосов
/ 07 мая 2011

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

1 голос
/ 07 мая 2011

Поскольку const char * не является допустимым инициализатором для массива.Более того, я считаю, c_str возвращает указатель на внутреннюю память, поэтому хранить ее небезопасно.

Возможно, вы захотите каким-либо образом скопировать значение (memcpy или std::copy или что-то еще).

0 голосов
/ 07 мая 2011

Просто создайте копию строки.Затем, если вам когда-нибудь понадобится доступ к нему как к символу *, просто сделайте это.

string el = myvector[1];
cout << &el[0] << endl;

Создайте строку const, если вам не нужно ее изменять.Вместо этого используйте c_str () для 'el', если хотите.

Или просто получите доступ к нему прямо из вектора с помощью:

cout << &myvector[1][0] << endl;

, если это возможно для вашей ситуации.

0 голосов
/ 07 мая 2011

Массивы в C ++ должны знать их размер и должны быть снабжены инициализаторами во время компиляции.Значение, возвращаемое c_str (), известно только во время выполнения.Если бы e1 был std :: string, как это и должно быть, проблем не было бы.Если это должен быть символ [], используйте для его заполнения strcpy.

char el[3];
strcpy( e1, myvector[1].c_str() );

Предполагается, что строка myvector [1] содержит максимум два символа.

...