实现isalpha(const char*s) - 如何改进这个功能?

hel*_*hod 3 c

我需要一种方法来检查字符串是否只包含字母字符.由于我在程序中需要多次使用该功能,因此我认为将它放入函数是个好主意.

这是我的实现:

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;
}
Run Code Online (Sandbox Code Playgroud)

我能在这里改进什么?传递某种大小以避免缓冲区溢出并允许检查"子串"是否有益?

mea*_*gar 7

您可以通过不必要地存储结果来缩短它.我通常认为简洁的代码是一种改进:

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

我相信这不能检查字符串中的第一个字符.您可以通过将isalpha测试移动到while条件来缩短它,这也可以确保检查第一个字符:

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

    return *s == '\0';
}
Run Code Online (Sandbox Code Playgroud)

  • 这段代码错了.事实上,在这样的函数中,在while条件中增加指针是一个非常常见的错误.这几乎总是错的,你可以把它称为反模式.在*执行任何计算表征您正在实现的算法之后,递增循环体*中的指针.我给了Wimmel正确答案的+1. (3认同)
  • @Antal:一个错误(在第二个代码片段中)是,如果一个字符串完全由字母字符组成,当`isalpha()`对'\ 0'字符起作用时,while循环将完成.但是,它也会将`s`指针递增超过'\ 0'字符,因此`return`语句将使无效指针值变为无效.如果字符串中的最后一个字符未通过`isalpha()`测试,则此错误还会导致函数返回不正确的结果. (3认同)
  • 如果*s =='\ 0',则第二个函数在while中增加s,然后再次检查*s,这不再指向'\ 0'. (2认同)
  • @Antal.因为在while条件下,您正在测试是否已到达(字符串的)末尾.如果尚未到达目的地,则表示您正在指向有效数据.因此,处理有效数据,然后(并且只有那时),将指针递增超过刚刚处理的数据.使这个增量操作成为while循环体中的最后一个是自然而正确的,因为然后你自然地循环以查看你现在是否已经到达了数据的末尾. (2认同)

R..*_*R.. 5

while ((*s|32)-'a'<26U) s++;
return !*s;
Run Code Online (Sandbox Code Playgroud)