在不使用C库函数的情况下比较2个字符串

时间:2016-10-14 05:01:40

标签: c ascii

如何在不使用C库函数的情况下比较2个字符串?我对如何编码" aardvark"感到困惑。是"大于" "沼泽"例如。我需要通过比较它们的字符来对二维字符串数组进行冒泡...这是我的问题。我是否使用strlen()比较字符串长度然后比较字符?请帮助,因为我有点困惑。感谢

3 个答案:

答案 0 :(得分:2)

使用strcmp("aardvark","bog");

如果它们相同则返回0,如果aardvark小于bog(它是)则返回负数,如果它更大则返回正数。

以下是文档的链接:

http://www.cplusplus.com/reference/cstring/strcmp/

方式"小于"或者"大于"计算不依赖于字符串长度,而是依赖于ASCII表。 A小于b,因此aardvark不到bog。蝾螈比沙拉更大,因为它们直到m / d字符匹配,直到你比较m和d。 M来自d。如果蝾螈是你的第一个参数而沙拉是第二个,那么它会返回一个正数。

如果出于某种原因,你真的不能使用c库函数,你可以通过将字符串逐字符比较来重新发明轮子。

类似于以下内容:

int compare(char* a, char* b)

{
    assert(a!=NULL&&b!=NULL);
    int i = 0; 
    while ( a[i] != '\0' ) 
    { 
        if( b[i] == '\0' ) { return 1; } 
        else if( a[i] < b[i] ) { return -1; }
        else if( a[i] > b[i] ) { return 1; } 
        i++; 
    } 
    if(b[i]=='\0')
        return 0;
    else 
        return -1;
}

同样,这里我使用的是比小于和大于比较单个字符,因为它们包含ASCII标准定义的整数值。

要查看我在说什么,请尝试将字符转换为int并打印它。

答案 1 :(得分:1)

我认为你应该学习Lexicalgraphic Order来编写你自己的字符串比较。 http://mathworld.wolfram.com/LexicographicOrder.html

答案 2 :(得分:0)

怎么样:

int mystrcmp(char *s1, char *s2)
{
    int i = 0;
    int c1, c2, ret_val = 0;

    while ((c1 = s1[i]) && (c2 = s2[i]) && (ret_val = c2 - c1) == 0)
        i++;

    if (ret_val)
        return ret_val;
    else if (c1 == '\0')
        c2 = s2[i];
    return c2 - c1;
}

使用两个字符串s1s2中的字符的整数值(可能是ASCII或UTF-8值),如果s1先于s2,则此函数返回正整数s2,如果s1位于s1之前,则为负值,如果s2'b'为等效字符串,则为零。

作为关于可移植性的关注点,例如,C标准不保证与'a'相关联的数值大于与mystrcmp("Aardvark", "aardvark") --> 32相关联的数值。实际上,对大多数人来说,这不是一个真正的问题。但是,还有其他编码方案,例如EBCDIC,有时会发现(例如旧的IBM大型机)。对于ASCII值,我们将mystrcmp("Aardvark", "aardvark") --> -64,即大写字母在小写字母之前。但是对于EBCDIC值,我们会tabularcolumns,因为在这个方案中大写字母遵循小写字母。有关此问题的讨论herehere