Реализация isalpha (const char * s) - как улучшить эту функцию?

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

Здесь моя реализация:

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;
}
</ctype.h>

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

6 ответов

Используйте strspn.

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


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

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';
}


while ((*s|32)-'a'<26U) s++;
return !*s;


Я изменил решение 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';
}


Предполагая, что строка и пространства ascii не разрешены:

int sisalpha(const char *s) {
 while(*s!='\0')
 {
 if((*s>='A'&&*s<='Z') || (*s>='a'&&*s<='z'))
 s++;
 else
 return 0;
 }
 return 1;
}


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

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

Наконец, 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;
}

licensed under cc by-sa 3.0 with attribution.