【问题标题】:NSString* to char*?NSString* 到 char*?
【发布时间】:2014-01-03 15:08:59
【问题描述】:

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

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

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

  • NSString* -> std::string : link

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

【问题讨论】:

  • 为什么你需要 char* 而不是 const char*? - 你真的需要修改它吗(如果 C++ 使用 std::string 而不是 char* 进行操作)
  • 这可能对你有帮助stackoverflow.com/questions/2996657/…
  • 我需要 char*,而不是 const char*。你的评论是多余的

标签: c++ ios objective-c nsstring char


【解决方案1】:

将其转换为 char*

(char*)[str UTF8String];

只要你不想编辑...

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

【讨论】:

  • 我喜欢 strcpy 的这种方式。
【解决方案2】:

注意这一点:

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

如果您打算修改字符串,或者打算长时间使用它,请对其进行适当的复制操作。或者使用getCString:maxLength:encoding:直接创建副本。

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

【讨论】:

  • 我是 C++ 的新手。据我了解,我创建了一个自动释放的 NSString 对象,然后将其传递给一个函数。因此,如果我在函数外部使用getCString: 进行转换,那么我可靠地拥有char* 变量,直到该函数完成,不是吗?
  • 你能发一个具体的例子吗?我试过这个:stackoverflow.com/questions/6687808/…,但它返回一个空字符串
【解决方案3】:

我的 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'。

【讨论】:

    【解决方案4】:

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

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

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

    Check out this other answer for more informations

    【讨论】:

    • char const *char * 的类型不同。将前者分配给后者是错误,而不是警告。
    猜你喜欢
    • 2015-01-31
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多