繁体   English   中英

如果两个相似的字符串长度不同,strcmp 返回什么?

[英]What does strcmp return if two similar strings are of different lengths?

我知道如果你在 strcmp 中有 'cat' (string1) 和 'dog' (string2)(这是一个 C 问题),那么 strcmp 的返回值将小于 0(因为 'cat' 在词法上小于 'dog ')。

但是,如果发生这种情况,我不确定 strcmp 会发生什么:

string1: 'dog'
string2: 'dog2'.

strcmp 会返回什么? 小于零、零还是大于? 对于上下文,我正在尝试编写一个比较器函数来比较字符串,并希望考虑以相同字符开头的字符串。 一个字符串可能有一个扩展名(例如上例中“dog2”中的“2”)。

编辑:这不是一个重复的问题。 据称这类似于询问返回类型代表什么的问题 - 我说的是当字符串在某一点上相同但其中一个停止而另一个继续时会发生什么。

它返回不同的八位字节的差异。 在您的示例中'\\0' < '2'因此返回负数。

它在 C 标准中定义为前两个不匹配字符之间的差异,但实现是狂野的。 唯一的共同点是,对于相等的字符串,返回值为零,然后对于str1<str2str1>str2分别为<0 or >0 来自ISO/IEC 9899:201x, §7.23.4 比较函数

比较函数 memcmp、strcmp 和 strncmp 返回的非零值的符号由被比较对象中不同的第一对字符(均解释为无符号字符)的值之间的差的符号决定。

但是一些实现会注意将典型值返回为0, 1 and -1 见苹果实现( http://opensource.apple.com//source/Libc/Libc-262/ppc/gen/strcmp.c ):

int
strcmp(const char *s1, const char *s2)
{
    for ( ; *s1 == *s2; s1++, s2++)
    if (*s1 == '\0')
        return 0;
    return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
}

编辑:在 Donut-release 的 Android 启动库( https://android.googlesource.com/platform/bootable/bootloader/legacy/+/donut-release/libc/strcmp.c )中,如果字符串相等,该函数返回01表示其他 2 种情况,仅用于逻辑运算:

int strcmp(const char *a, const char *b)
{
    while(*a && *b) {
        if(*a++ != *b++) return 1;
    }
    if(*a || *b) return 1;
    return 0;
}

C11报价

C11 N1570 标准草案

我认为"dog" < "dog2"由以下引号保证:

7.23.4比较函数1由比较功能memcmp,的strcmp返回非零值的符号,并STRNCMP由第一字符对(均为解释为无符号字符),在不同的值之间的差的符号来确定被比较的对象。

所以字符被解释为数字,并且'\\0'保证为0

然后:

7.23.4.2 strcmp 函数2 strcmp 函数将s1 指向的字符串与s2 指向的字符串进行比较。

说,显然,比较字符串,并且:

7.1.1 术语的定义 1 字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。

说 null 是字符串的一部分。

最后:

5.2.1 字符集 2 [...] 所有位都设置为 0 的字节,称为空字符,应存在于基本执行字符集中; 它用于终止一个字符串。

所以'\\0'等于零。

由于解释为unsigned char ,并且所有字符都不同,因此零是可能的最小数字。

来自 man strcmp:

如果发现 s1(或其前 n 个字节)分别小于、匹配或大于 s2,则 strcmp() 和 strncmp() 函数返回一个小于、等于或大于零的整数.

这通常会像@hroptatyr 描述的那样实现。

如果您只想比较两个字符串的初始len字符,请使用 strncmp 而不是 strcmp:

#include <string.h>
size_t len = 3;
int res = strncmp("dog", "dog2", len);

在这种情况下, res 将为 0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM