NSString* to char*?

NSString* to char*?

本文关键字:char to NSString      更新时间:2023-10-16

我写了一段同时使用c ++和Objective C的代码。

我需要将NSString*转换为char*. [str UTF8string]不起作用,因为它返回const char*.我知道:

  • std::string -> char*char* c = const_cast<char*>(pathStr.c_str());

  • NSString* -> std::string : 链接

但它看起来太奇怪了,我仍然无法验证它。我可以用更好的方式转换它吗,例如,NSString* -> const char* -> char*

将其转换为字符*

(char*)[str UTF8String];

只要你不想编辑它...如果你这样做,那么把它串到一些字符数组中。

我想这只取决于你想用它做什么。

注意这一点:

返回的 C 字符串是指向字符串内结构的指针 对象,其生存期可能短于字符串对象,并且 肯定不会有更长的寿命。因此,您应该复制 C 字符串(如果需要存储在内存上下文之外) 你称之为这种方法。

如果计划修改字符串,或者计划长时间使用它,请对其执行相应的复制操作。 或者使用getCString:maxLength:encoding:直接创建副本。

如果你不打算修改字符串,那么理论上没有必要强制转换为非常量(尽管许多接口确实在它们应该调用const char*时调用char*参数,所以有时你必须作弊)。

我的C++有点生疏,但你需要决定你的字符串是 ASCII 还是 Unicode,然后从那里开始。例如:

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

如果你想要一个 Unicode 字符串,你需要首先构造一个uint16_t null 终止数组,并将其传递给构造函数:

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"。

您最有可能遇到的是编译器警告,例如:

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

编译器给出该特定警告,因为如果没有限定符 const,指针可能会被取消围栏,然后进行修改。这不仅仅是一个技术问题,实际上是一个应该谨慎对待的警告。

查看此其他答案以获取更多信息