使用umlauted字符迭代字符串/ strlen

时间:2009-11-13 19:29:09

标签: c xcode macos character-encoding

这是我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函数,但我不知道这是否是一个非常/合理的解决方案。

4 个答案:

答案 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'结尾。因此可以像这样检查字符串的结尾。