在C语言中比较字符数组而不使用strcmp函数

5
我正在寻找一种比较两个字符数组而不使用strcmp的方法。这是正确的方法吗?还是我忽略了什么?当我在编译时输入相同的字符串时,程序会卡住并且不执行任何操作。请帮帮我!
编辑:对不起,应该是i而不是C。
int compare_info(char *array1, char *array2)
{

int i;
i = 0;

while(array1[i] == array2[i])
{
    if(array1[i] == '\0' || array2[i] == '\0')
        break;
    i++;
}

if(array1[i] == '\0' && array2[i] == '\0')
return 0;

else
    return-1;

}

2
问题出在 c++。哈哈。 - wakjah
4
你的第一个 while 循环是一个无限循环。你在比较 array1[i]array2[i],但是在循环内部 i 从未改变过。 - Lee Daniel Crocker
2
你在哪里定义 c 变量? - Paul Rooney
当你编译它时,你的代码没有编译。 - Iharob Al Asimi
这是问题所在:array2有预设的“option1” 我输入一个单词到array1中并进行比较,如果它们相等,则返回它们相等,否则返回不相等。 - Silvestrini
显示剩余2条评论
6个回答

4

这里有一个解决方案,与您的代码非常相似,但我进行了一些更改。我去掉了循环中间的返回语句,因为它们会破坏结构,这样分析起来更容易。最后,我添加了一个新条件到while循环中,所以当找到字符串的结尾时,循环就会结束。

int compare_info(char *array1, char *array2)
{
    int i;
    int response = 0;
    i = 0;

    while(array1[i] == array2[i] && response == 0 )
    {
        if(array1[i] == '\0' || array2[i] == '\0'){
            response = 1;
        }
        i++;
    }

    return response;
}

3

这里有一个解决方案

int compare_info(char *array1, char *array2)
{
    if ((array1 == NULL) || (array2 == NULL))
        return 0;
    while ((*array1 != '\0') && (*array2 != '\0') && (*array1 == *array2))
    {
        array1++;
        array2++;
    }
    return (*array1 == *array2);
}

也许您更喜欢这个。
int compare_info(char *array1, char *array2)
{
    int i;

    i = 0;
    if ((array1 == NULL) || (array2 == NULL))
        return 0;
    while ((array1[i] != '\0') && (array2[i] != '\0') && (array1[i] == array2[i]))
    {
        i++;
    }
    return (array1[i] == array2[i]);
}

如果您只需要比较字符串,可以将参数const,这样做更好的风格,因为您可以保证函数不会修改它们。也就是说,将参数定义为compare_info(const char *array1, const char *array2)


1
strcmp()函数返回一个负值,如果第一个参数按照字典序排列低于第二个参数;返回一个正值,如果第一个参数按照字典序排列高于第二个参数;如果它们相等,则返回零。你的比较结果要么是0(正确),要么是-1(不总是正确)。 - Jonathan Leffler
@JonathanLeffler他并没有说他想要模拟strcmp,他只是想比较两个字符串,当字符串不匹配时,这将返回0,否则返回非零值,将此函数转换为像strcmp一样返回值很容易,但我认为这个答案解决了问题,当然,我可能是错的。 - Iharob Al Asimi
1
初始的NULL参数检查会导致函数返回'true'(通常定义为'not false'或0x01或0x02)。这可能会对调用程序产生非常误导性的影响,如果只有一个数组指针包含null,则不正确(也许);如果两个数组指针都包含NULL,则绝对不正确。 - user3629249
@user3629249 我已经修复了。但我认为我仍然应该被点踩,因为我没有好好考虑这个问题。 - Iharob Al Asimi

2

除了其他答案外,我想补充以下内容作为一个不使用strcmpstrcmp替代品:

int strcmp_nohdr (char *s1, char *s2)
{
    if (!s1 && !s2) return 0;
    if (s1 && !s2) return 1;
    if (!s1 && s2) return -1;

    while (*s1 && *s2 && *s1 == *s2) s1++, s2++;

    if (!*s1 && !*s2) return 0;
    else if (*s1 > *s2) return 1;
    else return -1;
}

例子/输出:

$ strcmp_nohdr mydog mycat

 s1 is greater than s2

$ strcmp_nohdr mybat mycat

 s1 is less than s2

$ strcmp_nohdr mycat mycat

 s1 is equal to s2

$ strcmp_nohdr mycat myca

 s1 is greater than s2

$ strcmp_nohdr myca mycat

 s1 is less than s2

另一种选择是调用一个执行相同操作的汇编程序。

strcmp_nohdr(NULL, NULL) 会导致程序崩溃,对吧?不过没人会傻到这么做... :-) - user539810
你能解释一下这段代码吗?我不太明白你在这里说什么。 - Silvestrini
@Silvestrini 所示代码的工作原理与 strcmp 完全相同(除非该代码中如果 ptr 不是 NULL,则将 ptr > NULL 视为真)。 - user539810
@ChronoKitsune,看起来你确认了NULL,NULL被包含在if (!*s1 && !*s2) return 0;中。这是在这种情况下执行的第一条语句。 - David C. Rankin
@DavidC.Rankin 或许你误解了我的意思。当s1s2都是NULL时,s1 && !s2!s1 && s2都是false。因此,代码会继续执行while循环条件。由于两个指针都是NULL,在while循环中你会意外地对一个NULL指针进行解引用,这可能会导致崩溃。 - user539810

1
与某些人不同,我倾向于尽早捕获空指针(通过程序崩溃和调试器),因此我避免在下面进行任何空指针检查。换句话说,请勿将空指针传递给这些函数。 str_neq函数确定字符串是否不相等,根据您的代码似乎是正确的逻辑(如果相等则返回0/false,如果不相等则返回-1/true):
int
str_neq (const char *s1, const char *s2)
{
  while (*s1 != '\0' && *s1 == *s2)
    ++s1, ++s2;
  return -(*s1 != *s2);
}

为了提供与strcmp相同的行为,需要对计算返回值的表达式进行小的更改:
int
str_compare (const char *s1, const char *s2)
{
  while (*s1 != '\0' && *s1 == *s2)
    ++s1, ++s2;
  return *s1 - *s2;
}

我希望这有所帮助!:-)

个人喜好而已,但你可能有另外的原因 -- while (*s1 != '\0' ... 不只是简单地 while (*s1 ... 当指针移动到空结束符时,两个测试是等效的。您有偏好较长版本的任何原因吗? - David C. Rankin
@DavidC.Rankin 我更喜欢简短版,但为了清晰起见我选择了长版。看起来楼主更喜欢长版。 - user539810

0

简而言之:

int compare_info(char * array1, char * array2)
{
    char * ptr1 = array1;
    char * ptr2 = array2;

    while(*ptr1 && *ptr2 && *ptr1++==*ptr2++);
    if(!*ptr1 && !*ptr2 && *(ptr1-1)==*(ptr2-1)) return 0;
    return -1;
}

当两个数组相同时返回0,否则返回-1。(它与strcmp不相等。)


0
以下函数应该模仿 strcmp 的确切行为:
int compare_info(const char* array1,const char* array2)
{
    int i;
    for (i=0; array1[i]!=0 && array2[i]!=0; i++)
    {
        if (array1[i] > array2[i])
            return +1;
        if (array1[i] < array2[i])
            return -1;
    }
    if (array1[i] != 0)
        return +1;
    if (array2[i] != 0)
        return -1;
    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接