这是我previous question的后续行动。我成功地实现了检查umlauted字符的算法。下一个问题来自迭代字符串中的所有字符。我是这样做的:
int main()
{
char* str = "Hej du kalleåäö";
printf("length of str: %d", strlen(str));
for (int i = 0; i < strlen(str); i++)
{
printf("%s ", to_morse(str[i]));
}
putchar('\n');
return 0;
}
问题在于,由于声明的字符,它会打印18,并且还会使to_morse函数失败(忽略这些字符)。 toMorse方法接受unsigned char作为参数。解决这个问题的最佳方法是什么?我知道我可以在这里检查变音字符而不是letterNr函数,但我不知道这是否是一个非常/合理的解决方案。
答案 0 :(得分:3)
通常,您将字符串存储在wchar_t
中并使用ansi_strlen
之类的内容来获取它的长度 - 这将为您提供打印字符数而不是字节数你存储了。
你真的不应该实现UTF或Unicode或者你自己的任何多字节字符处理 - 有类似的库。
答案 1 :(得分:1)
在OS X上,Cocoa是一个解决方案 - 注意在NSLog中使用“%C” - 这是一个unichar(16位Unicode字符):
#import <Cocoa/Cocoa.h>
int main()
{
NSAutoreleasePool * pool = [NSAutoreleasePool new];
NSString * input = @"Hej du kalleåäö";
printf("length of str: %d", [input length]);
int i=0;
for (i = 0; i < [input length]; i++)
{
NSLog(@"%C", [input characterAtIndex:i]);
}
[pool release];
}
答案 2 :(得分:0)
编辑:您使用的是哪种语言环境?
如果您要对字符串进行迭代,请不要费心使用strlen
获取其长度。只需迭代,直到看到NUL
字符:
char *p = str;
while(*p != '\0') {
printf("%c\n", *p);
++p;
}
至于变形字符等,它们是UTF-8吗?如果字符串是多字节的,你可以这样做:
size_t n = strlen(str);
char *p = str;
char *e = p + n;
while(*p != '\0') {
wchar_t wc;
int l = mbtowc(&wc, p, e - p);
if(l <= 0) break;
p += l;
/* do whatever with wc which is now in wchar_t form */
}
老实说,如果mbtowc
在MB角色中间遇到-1
,则NUL
只会返回MB_CUR_MAX
。如果是这样,您只需传递e - p
而不是strlen
,然后取消{{1}}电话。但我感觉这是不的情况。
答案 3 :(得分:0)
您可以执行类似
的操作for (int i = 0; str[i]!='\0'; ++i){
//do something with str[i]
}
C中的字符串以'\ 0'结尾。因此可以像这样检查字符串的结尾。