CFStringCreateWithCString为字符串w /少于10个字符

时间:2017-04-21 19:34:13

标签: c core-foundation cfstring

我正在尝试在运行时从CFStringRef创建新的const char*,但CFStringCreateWithCString会为所有短于10个字符的字符串返回null

// Test w/ 9-character string
CFStringRef str1 = CFStringCreateWithCString(NULL, "123456789", kCFStringEncodingUTF8);
printf("str1: %p - %s\n", str1, CFStringGetCStringPtr(str1, kCFStringEncodingUTF8));

// Test w/ 10-character string
CFStringRef str2 = CFStringCreateWithCString(NULL, "0123456789", kCFStringEncodingUTF8);
printf("str2: %p - %s\n", str2, CFStringGetCStringPtr(str2, kCFStringEncodingUTF8));

以上示例的输出:

str1: 0x1ea1f72bb30ab195 - (null)
str2: 0x1005073e0 - 0123456789

如您所见,第一个字符串(由9个字符组成)返回null,而第二个字符串(10个字符)正常工作。

我做了一些测试,似乎CFStringCreateWithCString适用于超过10个字符的所有字符串,但对于9或更少的字符串,总是返回null

可能导致此行为的原因以及如何解决?

1 个答案:

答案 0 :(得分:0)

CFStringCreateWithCString适用于两个字符串。 CFStringGetCStringPtr的文档说:

  

快速获取指向C字符串缓冲区的指针,该缓冲区包含给定编码中字符串的字符。

     

此函数在常量时间内立即返回请求的指针,没有内存分配和复制,或返回NULL。如果后者是结果,则调用替代函数(如CFStringGetCString函数)来提取字符。

     

此函数是否返回有效指针或NULL取决于许多因素,所有因素都取决于字符串的创建方式及其属性。此外,功能结果可能会在不同版本之间和不同平台上发生变化。因此,在任何情况下都不要指望从此函数接收非NULL结果。