NSString * на символ *?

Я пишу кусок кода, который использует и C ++ и Objective C.

Мне нужно конвертировать NSString* в char*, [str UTF8string] не будет работать, потому что он возвращается const char*, Я знаю:

Но это выглядит слишком странно, и я до сих пор не могу это проверить. Могу ли я преобразовать его в лучшую сторону, например, NSString* -> const char* -> char*

2

Решение

Примени его к чарсу *

(char*)[str UTF8String];

Пока вы не хотите редактировать это … если вы это сделаете, то поместите его в какой-нибудь массив символов.

Я думаю, это зависит только от того, что вы хотите с этим делать.

20

Другие решения

Обратите внимание:

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

Если вы планируете изменить строку или планируете использовать ее в течение длительного периода времени, выполните для нее соответствующую операцию копирования. Или использовать getCString:maxLength:encoding: напрямую создать копию.

Если вы не планируете изменять строку, то теоретически нет необходимости приводить ее к неконстантным (хотя это правда, что многие интерфейсы требуют char* Парм, когда они должны призвать const char*, так что иногда приходится обманывать).

3

Мой C ++ немного ржавый, но вам нужно решить, является ли ваша строка ASCII или Unicode, а затем переходите оттуда. Например:

std::string foo = std::string( [str cStringUsingEncoding: NSASCIIStringEncoding] );

Если вам нужна строка в Юникоде, вам сначала нужно создать массив с нулевым символом в конце uint16_t и передать его конструктору:

NSUInteger len = [str length];
uint16_t str = calloc(len+1, sizeof(uint16_t);
for(int i=0; i<len; ++i) {
str[i] = [str characterAtIndex:i];
}
std::u16string foo = std::u16string( str );

Вышеупомянутое должно работать для большинства строк Unicode, но если ваши символы являются настоящими 32-битными, то вам нужно использовать ‘wstring, используя код, аналогичный второму примеру.

1

Скорее всего, вы видите предупреждение компилятора, например:

Initializing 'char *' with an expression of type 'const char *' discards qualifiers

Компилятор выдает это конкретное предупреждение, поскольку без квалификатора const указатель может быть разыменован, а затем изменен. Это не просто техническая составляющая, и на самом деле это осторожность, к которой следует относиться осторожно.

Проверьте этот другой ответ для получения дополнительной информации

1
По вопросам рекламы [email protected]