【问题标题】:Comparing 2 Strings without using C library functions [closed]在不使用 C 库函数的情况下比较 2 个字符串 [关闭]
【发布时间】:2016-10-14 05:01:39
【问题描述】:

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

【问题讨论】:

    标签: c ascii


    【解决方案1】:

    使用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 并打印它。

    【讨论】:

    • 您错过了“不使用 C 库函数”部分。
    • 其实我没有,我向用户发送了一个请求,解释他对c库函数的问题是什么。如果这是问题的一部分,而不是由于难以理解而回避,他不会建议 strlen。但我会更新以匹配问题,直到他回复为止。
    • @user3386109 已修复。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      怎么样:

      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 值),如果s1s2 之前,则此函数返回一个正整数,一个负数如果s2s1 之前则为值,如果s1s2 是等效字符串则为零。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 2019-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多