我有一个很奇怪的编译问题。
我想要使十六进制/十进制转换轻巧(没有stdio)。
以下是没有警告但结果为假的输出(应该是2014年):
xx@xxx:~/fcgi/test# sudo gcc dec.c -lm -o dec
xx@xxx:~/fcgi/test# ./dec 7DE
0
和输出时,有警告,但结果是正确的!
xx@xxx:~/fcgi/test# sudo gcc dec.c -lm -o dec
In file included from libhex.h:24:0,
from dec.c:2:
libhex.c: In function ‘ishexchar’:
libhex.c:54:12: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:23: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:33: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:45: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:55: warning: comparison between pointer and integer [enabled by default]
libhex.c:54:66: warning: comparison between pointer and integer [enabled by default]
xx@xxx:~/fcgi/test# ./dec 7DE
2014
下面是函数的代码,它检查正确的十六进制字符的代码,其中有一个非常小的错误(在c之前没有),但是工作函数:
int ishexchar (const int *c) {
return (c < 48 || (c > 57 && c < 65) || (c > 70 && c < 97) || c > 102) ? 1 : 0;
};
它的名称是这样的(其中c是一个使用int格式的字符)
ishexchar(&c);
谢谢你的阅读。如果你有同样的编译问题,告诉我。同时也告诉我这种轻蔑是否能让你感到不安,因为一旦问题解决,我就会在github上发布代码。就我的目的而言,它适用于尚未完全实现stdio的FastCGI中。
编辑:这里,用于十六进制/十进制转换的librairy的github:https://github.com/kevmuret/libhex
发布于 2014-04-29 06:56:32
丢失的*
是一个大错误。您的函数就是将指针值(即内存地址)与整数进行比较。这就解释了这个警告,它告诉你你在做什么,以及为什么这可能是错误的。
在与int比较时,要么更改函数的签名,要么取消指针引用(以比较实际的int值):
return (*c < 48 || (*c > 57 && *c < 65) || (*c > 70 && *c < 97) || *c > 102) ? 1 : 0;
或者写:
int ishexchar (int c)
{}
//and call like:
ishexchar(c);
PS:
您不需要将字符转换为int,您可以将char
与int
进行比较
char x = 'a';
if (x == 97)
puts("This is perfectly valid");
但是,不确定您的函数:c < 48
意味着您认为像"
和!
这样的字符是有效的十六进制字符。我不会。有效的字符是0-9,A-F和a-f。不多,不少:
int ishexchar(int c)
{
return ((c > 47 && c < 58) || (c > 96 && c < 103) || (c > 64 && c < 71) ? 1 : 0);
}
这应该能起作用,参考代码页。
记住这一点:ASCII表
发布于 2014-04-29 06:54:53
很明显,您正在执行警告所述的操作,即将指针与整数进行比较。
如果c
是const int *
,那么c < 48
会比较指针和整数。
传递指向这样一个函数的指针是没有意义的;移除*
并使其只
bool ishexchar(int c);
如果您确实希望传递一个指针,则需要在函数中取消引用该指针,即使用*c
获取c
所指向的值。我不明白“复制内存”的意义,但是,您确实不需要传递指针,因为字符不大于指针--没有胜利。
此外,当您可以避免使用“魔术常量”时,您不应该在代码中使用“魔术常量”。除非您试图只针对ASCII,否则对十进制数字的比较应该与'0'
和'9'
进行比较。您不能依赖字符any和any具有任何特定的顺序或编码,所以如果您不想成为ASCII-只有您必须以不同的方式进行这些测试。
最后,所有这些布尔值的数值结果都是0或1,使用?:
来强制它是没有意义的。
https://stackoverflow.com/questions/23368113
复制相似问题