当前位置:  开发笔记 > 编程语言 > 正文

我的字符串比较函数有什么问题?

如何解决《我的字符串比较函数有什么问题?》经验,为你挑选了2个好方法。

我的目标是以递归方式编写所有函数,以便让我看起来更聪明.为了好玩,我想出了一个字符串比较功能

#include 

int string_compare ( char * s1, char * s2 ) 
{
    int retval;
    switch ( s1 ? 1 : 0 + s2 ? 2 : 0 )
    {
       case 0 : retval = 1; break; 
       case 1 :  
       case 2 : retval = 0; break; 
       case 3 : retval = *s1 == *s2 ? string_compare(++s1,++s2) : 0; break;
    }
    return retval;
}

int main ( )
{
    char str1 [] = "hey there",
         str2 [] = "hey there";
    std::cout << string_compare(str1,str2);
}

但这是错误的,因为上面的代码是打印0而不是期望1.有什么问题?



1> YSC..:

运算符+ 优先于运算符?:.使用括号.

switch ( (s1 ? 1 : 0) + (s2 ? 2 : 0) )

完全纠正

对于完整的,有效的C字符串递归比较函数,这是一个实现:

/// @retval -1 iff sting s1 is before s2
/// @retval  0 iff sting s1 is equal to s2
/// @retval +1 iff sting s1 is afters2
int string_compare(const char* s1, const char* s2)
{
    if (*s1 > *s2) return 1;
    if (*s1 < *s2) return -1;

    if (*s1 == 0)
        return 0; // *s1 == *s2 == '\0'

    return string_compare(++s1, ++s2);
}

我们的想法是将结果定义为递归语句:

空字符串小于任何非空字符串;

如果两个s1s2是空的,s1 == s2;

如果第一个字符s1小于其中一个s2,s1 < s2;

如果第一个字符s1大于s2,则s1 > s2;

如果第一个字符s1是相等的一个s2,,
的顺序S1s2相同的字符串的顺序,采取了他们的第一个字符.

示范

#include 
#include 

namespace
{
    int string_compare(const char* s1, const char* s2)
    {
        if (*s1 > *s2) return 1;
        if (*s1 < *s2) return -1;

        if (*s1 == 0)
            return 0; // *s1 == *s2 == '\0'

        return string_compare(++s1, ++s2);
    }
}

int main()
{
    const char* words[] = {
        "recursive",
        "compare",
        "function",
        "for",
        "C",
        "string",
        "is",
        "really",
        "useless",
        "dont",
        "you",
        "think",
        " ",
        "recursive"
    };

    std::sort(std::begin(words), std::end(words), [](auto lhs, auto rhs){ return string_compare(lhs, rhs) < 0;});

    for (auto s : words)
        std::cout << s << std::endl;
}

产量

 
C
compare
dont
for
function
is
really
recursive
recursive
string
think
useless
you

Demo



2> Jarod42..:

使用父母(并修复条件):

(*s1 ? 1 : 0) + (*s2 ? 2 : 0)

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有