Реализация isalpha (const char * s) - как улучшить эту функцию? - PullRequest
3 голосов
/ 04 декабря 2010

Мне нужен способ проверить, содержит ли строка только буквенные символы. Поскольку мне несколько раз нужна функциональность в моей программе, я подумал, что было бы неплохо поместить ее в функцию.

Вот моя реализация:

int sisalpha(const char *s) {
    int result = 1;

    while (s++ != '\0') {
        result = isalpha(*s); // uses isalpha of <ctype.h>

        if (result == 0) {
            return result;
        }
    }

    return result;
}

Что я мог бы улучшить здесь? Было бы полезно также передать какой-то размер, чтобы избежать переполнения буфера и позволить проверку «подстрок»?

Ответы [ 6 ]

7 голосов
/ 04 декабря 2010

Вы можете сократить его, не бесполезно сохраняя результат. Обычно я считаю сжатый код улучшением:

int sisalpha(const char *s) {
    while (*s++ != '\0')
        if (!isalpha(*s))
            return 0;
    return 1;
}

Я считаю, что это не в состоянии проверить первый символ в строке, хотя. Вы можете сделать его еще короче, переместив тест isalpha в условие while, что также гарантирует проверку первого символа:

int sisalpha(const char *s) {
    while (isalpha(*s))
      ++s;

    return *s == '\0';
}
5 голосов
/ 04 декабря 2010
while ((*s|32)-'a'<26U) s++;
return !*s;
3 голосов
/ 04 декабря 2010

Использовать strspn .

Сделать набор символов для проверки, алфавит в верхнем и нижнем регистре.Если значение, возвращаемое strspn, совпадает со значением strlen, то все это буквенно.

3 голосов
/ 04 декабря 2010

Предполагается, что строка ascii и пробелы не допускаются:

int sisalpha(const char *s) {

        while(*s!='\0')
        {
            if((*s>='A'&&*s<='Z') || (*s>='a'&&*s<='z'))
                s++;
            else
                return 0;
        }
        return 1;
}
3 голосов
/ 04 декабря 2010

Я изменил решение meagar, чтобы поставить s ++ вне условия while:

int sisalpha(const char *s) {
    while (*s != '\0')
        if (!isalpha(*s++))
            return 0;
    return 1;
}

int sisalpha(const char *s) {
    while (isalpha(*s))
        s++;
    return *s == '\0';
}
2 голосов
/ 04 декабря 2010

Как уже упоминалось в других ответах, вам необходимо убедиться, что вы проверяете первый символ.

Кроме того, если вы считаете, что пустая строка состоит из буквенных символов, вы должны четко задокументировать это (фактически вы должны четко задокументировать, что пустая строка в любом случае).

Наконец, isalpha() принимает только те аргументы, которые могут быть представлены как unsigned char или равны EOF. Если ваша подпрограмма скомпилирована на платформе, где подписано char, возможно, вы нарушаете это ограничение.

Вот версия sisalpha(), которая исправляет эти проблемы (пустая строка возвращает 1 - я не уверен, что вы этого хотите или нет):

int sisalpha(const char *s) {

    for (; *s != 0; ++s) {
        unsigned char c = *s;

        if (!isalpha(c)) return 0;
    }

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