首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gcc奇怪的C编译只有在警告时才能纠正

gcc奇怪的C编译只有在警告时才能纠正
EN

Stack Overflow用户
提问于 2014-04-29 14:51:07
回答 2查看 97关注 0票数 0

我有一个很奇怪的编译问题。

我想要使十六进制/十进制转换轻巧(没有stdio)。

以下是没有警告但结果为假的输出(应该是2014年):

代码语言:javascript
运行
复制
xx@xxx:~/fcgi/test# sudo gcc dec.c -lm -o dec
xx@xxx:~/fcgi/test# ./dec 7DE
0

和输出时,有警告,但结果是正确的!

代码语言:javascript
运行
复制
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之前没有),但是工作函数:

代码语言:javascript
运行
复制
int ishexchar (const int *c) {
    return (c < 48 || (c > 57 && c < 65) || (c > 70 && c < 97) || c > 102) ? 1 : 0;
};

它的名称是这样的(其中c是一个使用int格式的字符)

代码语言:javascript
运行
复制
ishexchar(&c);

谢谢你的阅读。如果你有同样的编译问题,告诉我。同时也告诉我这种轻蔑是否能让你感到不安,因为一旦问题解决,我就会在github上发布代码。就我的目的而言,它适用于尚未完全实现stdio的FastCGI中。

编辑:这里,用于十六进制/十进制转换的librairy的github:https://github.com/kevmuret/libhex

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-29 14:56:32

丢失的*是一个大错误。您的函数就是将指针值(即内存地址)与整数进行比较。这就解释了这个警告,它告诉你你在做什么,以及为什么这可能是错误的。

在与int比较时,要么更改函数的签名,要么取消指针引用(以比较实际的int值):

代码语言:javascript
运行
复制
return (*c < 48 || (*c > 57 && *c < 65) || (*c > 70 && *c < 97) || *c > 102) ? 1 : 0;

或者写:

代码语言:javascript
运行
复制
int ishexchar (int c)
{}
//and call like:
ishexchar(c);

PS:

您不需要将字符转换为int,您可以将charint进行比较

代码语言:javascript
运行
复制
char x = 'a';
if (x == 97)
   puts("This is perfectly valid");

但是,不确定您的函数:c < 48意味着您认为像"!这样的字符是有效的十六进制字符。我不会。有效的字符是0-9,A-F和a-f。不多,不少:

代码语言:javascript
运行
复制
int ishexchar(int c)
{
    return ((c > 47 && c < 58) || (c > 96 && c < 103) || (c > 64 && c < 71) ? 1 : 0);
}

这应该能起作用,参考代码页

记住这一点:ASCII表

票数 0
EN

Stack Overflow用户

发布于 2014-04-29 14:54:53

很明显,您正在执行警告所述的操作,即将指针与整数进行比较。

如果cconst int *,那么c < 48会比较指针和整数。

传递指向这样一个函数的指针是没有意义的;移除*并使其只

代码语言:javascript
运行
复制
bool ishexchar(int c);

如果您确实希望传递一个指针,则需要在函数中取消引用该指针,即使用*c获取c所指向的值。我不明白“复制内存”的意义,但是,您确实不需要传递指针,因为字符不大于指针--没有胜利。

此外,当您可以避免使用“魔术常量”时,您不应该在代码中使用“魔术常量”。除非您试图只针对ASCII,否则对十进制数字的比较应该与'0''9'进行比较。您不能依赖字符any和any具有任何特定的顺序或编码,所以如果您不想成为ASCII-只有您必须以不同的方式进行这些测试。

最后,所有这些布尔值的数值结果都是0或1,使用?:来强制它是没有意义的。

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

https://stackoverflow.com/questions/23368113

复制
相关文章

相似问题

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