只是为了好玩,我写了这个isalpha的实现,它是有效的,但我有很多警告,你能告诉我如何修复它们,或者我如何才能用更好的方式呢?
警告:
第6行:指针和整数之间的比较
第23行:传递“pointer”的参数1使指针来自整型,而不进行强制转换
#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;
}发布于 2016-10-26 04:11:08
这个代码是不可移植的,因为标准甚至不保证执行字符集按顺序包含拉丁字母表的字母。例如,参见here和here。
这是一个更便携的版本:
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编写。这是一个很好的观点,除了说我正在解决你提出的问题的那一部分之外,我没有真正的辩护,“我如何才能以更好的方式做到这一点?”
有了这些警告,我将暂时离开我的答案……
https://stackoverflow.com/questions/40248520
复制相似问题