在C语言中比较两个字符串

3

我正在测试一个小程序,基本上它会比较两个输入字符串是否相同(就像strcmp函数一样)。然而,无论如何,我都得到了结果,说这两个字符串是不同的。如果有人能找出一些错误,我会很感激。

int comp(char str1[], char str2[]) {
    int i = 0;
    while (str1[i] == str2[i]) {
        if (str1[i] == '\0' || str2[i] == '\0')
            break;
        i++;
    }
    if (str1[i] == '\0' && str2[i] == '\0')
        return 0;
    else
        return -1;
}


int main(int argc, char * * argv) {
    int cmp;
    char str1[1000], str2[1000];
    cmp = comp(str1, str2);
    if (cmp == 0)
        printf("The two strings are identical.\n");
    else
        printf("The two strings are different.\n");
    return 0;
}

6
数组str1[1000]str2[1000]的内容从未被设置。我们甚至不能确定它们是否有空字符终止符。 - chux - Reinstate Monica
3
@Olaf: "为了与标准兼容...": 指的是哪个标准?大多数libc函数都像OP一样指示"错误"。此外,标准的strcmp()在相等时返回0 - alk
2
@alk:C11标准。比较运算符产生(int)0(int)1comp显然是strequalstrcmp返回三元结果,因此这是一个不好的参考。一般来说,应该使用“可读性强”的名称:if ( strequal(...) )if ( !strcomp(...) )更好。 - too honest for this site
1
@alk:抱歉,我没有表达清楚:comp 实际上应该被称为 strequal 或者类似的名称。最后一个应该是 if ( !comp(...) ) - too honest for this site
1
简化版:while (str1[i] == str2[i]) { if (str1[i] == '\0') break; i++; }|| str2[i] == '\0' 永远不会成立。 - chux - Reinstate Monica
显示剩余7条评论
2个回答

8

您的函数运行良好。唯一的问题是您的两个字符数组未初始化,这会导致未定义行为。


在这里提供一些背景信息--当您的代码运行时,str1str2的>= 2000字节将被分配在堆栈上;这意味着堆栈指针将减少>= 2000字节,并且每个变量的指针将存储在两个寄存器中(一个用于str1,一个用于str2)。因为您实际上没有初始化它们,存储在堆栈上的那些>= 2000字节的任何内容在技术上都是数组中的“值”。有什么?谁知道,直到您告诉进程在内存中存储某些东西,它都只是一个随机字节的黑盒子。 - Byte Lab
谢谢。我想比较两个用户输入的字符串,这就是为什么我将其未初始化的原因。我想做类似于 ./a.out equal equal 的测试,我应该使用 scanf("%s %s", str1, str2); 吗? - Walle
为了避免用户输入时缓冲区溢出,更好的方法是使用 scanf(%999s %999s, str1, str2); - alk
我尝试了那个,但显然它似乎陷入了一个无限循环。 - Walle

0

这里有一个实现,使用命令行参数。

#include <stdio.h>
#include <stdlib.h>

int comp(char str1[], char str2[])
{
    int i = 0;
    while (str1[i] == str2[i])
    {
        if (str1[i] == '\0' || str2[i] == '\0')
            break;
        i++;
    }

    if (str1[i] == '\0' && str2[i] == '\0')
        return 0;
    else
        return -1;
}


int main(int argc, char * * argv)
{
    if( 3 != argc )
    {
        printf( "USAGE: %s, firstString secondString\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    // implied else, correct number of parameters

    if ( !comp( argv[1], argv[2]) )
        printf("The two strings are identical.\n");
    else
        printf("The two strings are different.\n");
    return 0;
}

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