Перебор строки / строки с умаленными символами - PullRequest
1 голос
/ 13 ноября 2009

Это продолжение моего предыдущего вопроса . Мне удалось реализовать алгоритм проверки умаленных символов. Следующая проблема возникает из-за перебора всех символов в строке. Я делаю это так:

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 принимает в качестве параметра неподписанный символ. Что было бы лучшим способом решить это? Я знаю, что могу проверить здесь символ умляута вместо функции letterNr, но не знаю, будет ли это довольно логичным решением.

Ответы [ 4 ]

3 голосов
/ 13 ноября 2009

Обычно вы сохраняете строку в wchar_t и используете что-то вроде ansi_strlen, чтобы получить ее длину - это даст вам количество напечатанных символов вместо количества сохраненных вами байтов.

Вы действительно не должны реализовывать UTF или Unicode или любой другой многобайтовый символ, обрабатывающий себя - есть библиотеки для такого рода вещей.

1 голос
/ 13 ноября 2009

В OS X Какао является решением - обратите внимание на использование «% C» в NSLog - это 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];
}
0 голосов
/ 13 ноября 2009

Вы могли бы сделать что-то вроде

for (int i = 0; str[i]!='\0'; ++i){
    //do something with str[i]
}

Строки в C заканчиваются на '\ 0'. Таким образом, можно проверить конец строки следующим образом.

0 голосов
/ 13 ноября 2009

РЕДАКТИРОВАТЬ : Какую локаль вы используете?

Если вы собираетесь повторять по строке, не беспокойтесь о получении ее длины с 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 просто возвращать -1, если он встретит NUL в середине символа MB. Если это произойдет, вы можете просто передать MB_CUR_MAX вместо e - p и покончить с вызовом strlen. Но я чувствую, что это не дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...