【问题标题】:Compare string with ">", "<", "=" in c在c中将字符串与“>”、“<”、“=”进行比较
【发布时间】:2021-10-24 16:32:50
【问题描述】:

我想知道当我们有 s1 > s2 时比较什么以及结果是什么(例如,当我们比较字符时,比较它们的 ASCII 对应代码)。我读到这个操作是比较 s1 和 s2 的第一个字符,但是如果我尝试与 s1[0] > s2[0] 比较结果是不同的,那就不可能了。

【问题讨论】:

  • “s1 和 s2 的第一个字符”是否意味着 s1 和 s2 是字符串?比较指向两个不同对象的指针的结果是未定义的。请发布Minimal Reproducible Example。关于问题的标题,您不能使用= 进行比较。并且不能使用&lt;&gt; 来比较字符串:请使用strcmp()
  • s1s2 包含指向数组第一个位置的内存地址,它与 &amp;s1[0]&amp;s2[0] 相同,您将比较这些地址。
  • 风向标所说的。使用strcmp 比较 C 中的字符串,以实现严格相等和简单的“字典顺序”大于和小于。
  • 我无法更改编写此代码的方式。它们是我的教授写的,但我需要了解他们做了什么。 s1 和 s2 是字符串,但我尝试打印这两个变量,但结果似乎不是地址

标签: c if-statement comparison implicit-conversion c-strings


【解决方案1】:

==比较意味着检查指针是否指向同一个对象,所以这样:

char s1[] = "foo";
char s2[] = "foo";
if(s1 == s2) 
    puts("Same object");
else
    puts("Different object");

将打印“不同的对象”。

&lt;&gt; 绝对没有意义,除非指针指向同一个对象。例如,您可以这样做:

char s[] = "asdfasdf";
char *p1 = &s[3], *p2 = &s[6];
if(p1 < p2) 
    // Code

【讨论】:

    【解决方案2】:

    如果你有字符数组,例如

    char s1[] = "Hello";
    char s2[] = "Hello";
    

    然后在 if 语句中,例如 this

    if ( s1 == s2 ) { /*,,,*/ }
    

    字符数组被隐式转换为指向它们的第一个元素的指针。

    所以上面的语句等价于

    if ( &s1[0] == &s2[0] ) { /*,,,*/ }
    

    由于数组占用的内存范围不同,因此这种比较的结果将始终等于逻辑假。

    如果要比较存储在数组中的字符串,需要使用标头 &lt;string.h&gt; 中声明的标准字符串函数 strcmp

    例如

    #include <string.h>
    #include <stdio.h>
    
    //...
    
    if ( strcmp( s1, s2 ) == 0 )
    {
        puts( "The strings are equal." );
    }
    else if ( strcmp( s1, s2 ) < 0 )
    {
        puts( "The first string is less than the second string." );
    }
    else
    {
        puts( "The first string is greater than the second string." );
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用以下可能被视为轻微滥用预处理器的宏。

      #define STROP(a, OP, b) (strcmp(a, b) OP 0)
      

      示例用法:

      STROP(s1, >=, s2) // expands to `strcmp(s1,s2) >= 0`
      
      STROP(s1, ==, s2) // expands to `strcmp(s1, s2) == 0`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-01
        • 1970-01-01
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 2019-02-27
        相关资源
        最近更新 更多