c - 32 位和 64 位系统中的 strcmp 行为

标签 c 32bit-64bit strcmp

以下代码片段在 32 位和 64 位操作系统中的行为不同。

char *cat = "v,a";
if (strcmp(cat, ",") == 1)
    ...

上述条件在 32 位中为真但在 64 位中为假。我想知道为什么这是不同的? 32 位和 64 位操作系统都是 Linux (Fedora)。

最佳答案

strcmp()如果参数 1 在参数 2 之前,则函数仅定义为返回负值,如果它们相同则返回零,或者如果参数 1 在参数 2 之后返回正值。

不保证返回的值将是 +1。或 -1随时。基于该假设的任何相等性测试都是错误的。可以想象,strcmp() 的 32 位和 64 位版本为给定的字符串比较返回不同的数字,但查找 +1 的任何测试来自 strcmp()存在固有缺陷。

您的比较代码应该是以下之一:

if (strcmp(cat, ",") >  0)    // cat >  ","
if (strcmp(cat, ",") == 0)    // cat == ","
if (strcmp(cat, ",") >= 0)    // cat >= ","
if (strcmp(cat, ",") <= 0)    // cat <= ","
if (strcmp(cat, ",") <  0)    // cat <  ","
if (strcmp(cat, ",") != 0)    // cat != ","

注意共同的主题——所有测试都与 0 进行比较。您还会看到人们写道:

if (strcmp(cat, ","))   // != 0
if (!strcmp(cat, ","))  // == 0

就个人而言,我更喜欢与零进行显式比较;我在心里将速记翻译成适当的速记(并且讨厌被迫这样做)。


请注意 strcmp() 的规范说:

ISO/IEC 9899:2011 §7.24.4.2 The strcmp function

¶3 The strcmp function returns an integer greater than, equal to, or less than zero, accordingly as the string pointed to by s1 is greater than, equal to, or less than the string pointed to by s2.

它没有提到 +1-1 ;您不能依赖结果的大小,只能依赖它的符号(或者当字符串相等时它为零)。

关于c - 32 位和 64 位系统中的 strcmp 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095575/

相关文章:

c - 可以在 C 中返回和释放动态分配的数组吗?

vba - 如何使VBA代码与Office 2010兼容-64位版本和较旧的Office版本

c++ - 在 vector 上使用 strcmp

c - install_man() 不获取生成文件的路径

c - Obj-C 有@available。 swift 有#available。我可以在 C/C++ 中使用什么?

c - 有没有办法接收各种数据类型?

c++ - 是否有标准方法可以在编译时确定系统是 32 位还是 64 位?

ubuntu - 在 64 位 Ubuntu 14.04 上编译 32 位 fortran 程序

C 程序 - 带函数的回文 - 几乎完全完成了一个小问题

c - strcmp 在我的代码中不起作用