我使用以下代码将字符串数据存储在char *。
中 NSString *hotelName = [components[2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
hotelInfo->hotelName = malloc(sizeof(char) * hotelName.length + 1);
strncpy(hotelInfo->hotelName, [hotelName UTF8String], hotelName.length + 1);
NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);
问题在于奇怪印刷的希腊字符。我也尝试过使用其他编码(例如NSWindowsCP1253StringEncoding -it crashes-)
我甚至试过了:
hotelInfo->hotelName = (const char *)[hotelName cStringUsingEncoding:NSUnicodeStringEncoding];
但它也会产生奇怪的字符。
我想念什么?
修改 经过一些建议我尝试了以下内容:
if ([hotelName canBeConvertedToEncoding:NSWindowsCP1253StringEncoding]){
const char *cHotelName = (const char *)[hotelName cStringUsingEncoding:NSWindowsCP1253StringEncoding];
int bufSize = strlen(cHotelName) + 1;
if (bufSize >0 ){
hotelInfo->hotelName = malloc(sizeof(char) * bufSize);
strncpy(hotelInfo->hotelName, [hotelName UTF8String], bufSize);
NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);
}
}else{
NSLog(@"String cannot be encoded! Sorry! %@",hotelName);
for (NSInteger charIdx=0; charIdx<hotelName.length; charIdx++){
// Do something with character at index charIdx, for example:
char x[hotelName.length];
NSLog(@"%C", [hotelName characterAtIndex:charIdx]);
x[charIdx] = [hotelName characterAtIndex:charIdx];
NSLog(@"%s", x);
if (charIdx == hotelName.length - 1)
hotelInfo->hotelName = x;
}
NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);
}
但仍然没有!
答案 0 :(得分:1)
首先,不能保证任何NSString
都可以表示为C字符数组(所谓的 C-String )。原因是可用的字符集有限。您应该检查字符串是否可以转换(通过调用canBeConvertedToEncoding:
)。
其次,在使用malloc
和strncpy
函数时,它们依赖于 C-String 的长度,而不是NSString
的长度。所以你应该首先从NSString获取C-String,然后得到它的长度(strlen
),并将此值用于函数调用:
const char *cHotelName = (const char *)[hotelName cStringUsingEncoding:NSWindowsCP1253StringEncoding];
int bufSize = strlen(cHotelName) + 1;
hotelInfo->hotelName = malloc(sizeof(char) * bufSize);
strncpy(hotelInfo->hotelName, cHotelName, bufSize);