首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isalpha实现C

isalpha实现C
EN

Stack Overflow用户
提问于 2016-10-26 03:49:49
回答 1查看 4.4K关注 0票数 0

只是为了好玩,我写了这个isalpha的实现,它是有效的,但我有很多警告,你能告诉我如何修复它们,或者我如何才能用更好的方式呢?

警告:

第6行:指针和整数之间的比较

第23行:传递“pointer”的参数1使指针来自整型,而不进行强制转换

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>

int my_isalpha(char *mark)
{
    if((((mark)>=0x41)&&((mark)<=0x5A)||((mark)>=0x61)&&((mark)<=0x7A))) //WARNING
     return 1;

   else
    return 0;
}


int main()
{
   char mark;
   int (*pointer)(char*);
   pointer=my_isalpha;

   printf("Your mark: ");
   scanf("%c",&mark);

   if(pointer(mark))  //WARNING
     printf("TRUE");

   else
    printf("FALSE");

  return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2016-10-26 04:11:08

这个代码是不可移植的,因为标准甚至不保证执行字符集按顺序包含拉丁字母表的字母。例如,参见herehere

这是一个更便携的版本:

代码语言:javascript
复制
int my_isalpha(int c)
{
    char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                      "abcdefghijklmnopqrstuvwxyz";
    char *letter = alphabet;

    while(*letter != '\0' && *letter != c)
        ++letter;

    if (*letter)
        return 1;

    return 0;
}

正如@Dmitri在注释中指出的那样,如果在运行时以这样一种方式更改执行字符集,则即使此代码也可能失败,即字符的数值不再与编译时相同。因此,最好使用标准库函数isalpha(),它利用了当前的语言环境。

@KeithThompson建议我对可移植性的关注可能有些不恰当,因为isalpha()是一个库函数,它必须在包含它的实现中工作,但本身并不需要用可移植的C编写。这是一个很好的观点,除了说我正在解决你提出的问题的那一部分之外,我没有真正的辩护,“我如何才能以更好的方式做到这一点?”

有了这些警告,我将暂时离开我的答案……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40248520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档