我正在翻译一个小的java库,用于我正在编写的目标c应用程序。
char[] chars = sentence.toCharArray();
int i = 0;
while (i < chars.length) { ... }
句子是NSString。 我想将上面的java代码翻译成目标c。这是我到目前为止所做的:
sentence = [sentence stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // trims sentence off white space
const char *chars = [sentence UTF8String];
我如何以上条件?我不确定在将字符串转换为字符数组后我应该如何检查字符串的长度。
答案 0 :(得分:6)
你的Objective-C字符串已经包含了它的长度,只需要检索它:
sentence = [sentence stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // trims sentence off white space
NSUInteger length= sentence.length;
const char *chars = [sentence UTF8String];
但我想记住,即使你不知道长度,也可以使用C strlen函数:
sentence = [sentence stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; // trims sentence off white space
const char *chars = [sentence UTF8String];
size_t length= strlen(chars);
答案 1 :(得分:4)
即使已经有一个已接受的答案我想警告使用strlen(),即使在这种情况下也可能没有任何问题。 NSString和C-Strings之间存在差异。
一个。 -length
(NSString
)和strlen()
具有不同的语义:
NSString
不是(!)\ 0终止,而是基于长度。它可以存储\ 0个字符。如果字符串实例中有\ 0字符,则很容易获得不同的长度:
NSString *sentence = @"Amin\0Negm";
NSLog( @"length %ld", [sentence length]); // 9
const char *chars = [sentence cStringUsingEncoding:NSUTF8StringEncoding];
size_t length= strlen(chars);
NSLog(@"strlen %ld", (long)length); // 4
length 9
strlen 4
但是-UTF8String
甚至使用的-cStringUsingEnocding:
(两个NSString
)都会复制存储在字符串实例中的整个字符串。 (我认为在-cStringUsingEncoding
的情况下它会产生误导,因为像strlen()
这样的标准字符串函数总是使用 first \ 0作为字符串的终止。)
B中。在UTF8中,字符可以具有多字节。 C中的char是一个字节。 (字节不是8位的含义,而是最小的可寻址单位。)
NSString *sentence = @"Αmin Negm";
NSLog( @"length %ld", [sentence length]);
const char *chars = [sentence UTF8String];
size_t length= strlen(chars);
NSLog(@"strlen %ld", (long)length);
length 9
strlen 10
WTF发生在这里? Amin的“A”不是拉丁语大写字母A而是希腊大写字母Alpha。在UTF8中,这需要两个字节,对于纯C的strlen,有两个字符!
NSLog(@"%x-%x %x-%x", 'A', 'm', (unsigned char)*chars, (unsigned char)*(chars+1) );
41-6d ce-91
前两个数字是'A','m'的代码,后两个数字是希腊大写字母Alpha(CE 91)的UTF8代码。
我不认为,在没有充分理由和完全理解问题的情况下,简单地从NSString
更改为char *
是个好主意。如果您不期望这样的字符,请使用NSASCIIStringEncoding
。如果您希望这些字符一次又一次地检查您的代码......或者阅读C.
℃。 C支持宽字符。这与Mac OS的unichar类似,但键入wchar_t
。 wchar.h中有wchar_t的字符串函数。
NSString *sentence = @"Αmin Negm";
NSLog( @"length %ld", [sentence length]);
wchar_t wchars[128]; // take care of the size
wchar_t *wchar = wchars;
for (NSUInteger index = 0; index < [sentence length]; index++)
{
*wchar++ = [sentence characterAtIndex:index];
}
*wchar = '\0';
NSLog(@"widestrlen %ld", wcslen(wchars));
length 9
widestrlen 9
d。显然你想迭代字符串。纯C中的常见模式不是使用索引并将其与长度进行比较,并且绝对不会在每个循环中与strlen()
进行比较,因为它会产生高成本。 (C字符串不是基于长度的,因此必须一遍又一遍地扫描整个字符串。)您只需将指针递增到下一个字符:
char letter;
while ( (letter = *chars++) ) {…}
或
do
{
// *chars points to the actual char
} while (*char++);
答案 2 :(得分:-1)
int lenght = sizeof(chars) / sizeof(char)
可能会起作用,但它会(在最好的情况下)返回相同的东西 sentence.lenght 在最坏的情况下0因为整个指针/ sizeof我现在都不记得了