使用指针比较字符串?

时间:2014-07-07 20:06:16

标签: c c-strings

我是一名信息学生(大学),我现在正在学习C语言。 我正在尝试做一些关于指针和字符串的练习。我找到了一个特定功能的广告练习,有助于使用指针比较2个字符串。 该函数的解决方案是:

int compare_strings( char *a, char *b){
  int i = 0;

  while( *( a + i ) != '\0' && *( b + i ) != '\0' ){
    if( *( a + i ) < *( b + i ) ){
      return -1;
    } else if( *( a + i ) > *( b + i ) ){
      return 1;
    }
    i++;
  }
  if( *( a + i ) == '\0' && *( b + i ) == '\0' ){
    return 0;
  } else if( ( a + i ) != '\0' ){
    return 1;
  } else {
    return -1;
  }
}

我真的不明白这个功能。字母字符怎么能比另一个字母字符“更多”呢?这是什么意思? 或者只是它是不正确的? 非常感谢你:))

3 个答案:

答案 0 :(得分:2)

根据某种编码方案,每个字符都有其内部表示。例如,ASCII中的字符“A”存储为值65,“B” - 存储为66,依此类推。因此,当您比较字符时,会比较它们的内部代码。

所有都是计算机内的数字。:)并且有两个这样的数字:0和1.所有其他数字和符号(从人的角度来看)由这两个数字组成。

尝试下面的代码

会更清楚
#include <stdio.h>

int main(void) 
{
    char c;

    for ( c = 'A'; c <= 'Z'; ++c )
    {
        printf( "%d ", (int )c );
    }

    puts( "" );

    return 0;
}

输出

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 

考虑到当字符用作关系运算符的操作数时,它们会隐式转换为类型int,就像在我的程序中一样,我明确地将它们转换为int。

答案 1 :(得分:1)

在C中,与大多数语言一样,char只是整数,使用某种表格(例如ASCII表格)或UTF-8UTF-16进行转换等)。在ASCII中,您具有'A' = 0x41'a' = 0x61UTF-8中的相同值,因为UTF-8仅扩展ASCII表而不进行修改)。比较char只是比较所谓的ASCII值(即使编码系统不总是ASCII值)。

在大多数(不是全部,请参阅chux评论)编码系统中,超出char的整数值保持字母顺序,并将大写字母放在小写字母的较低位置,因此'A' < 'a'和{{ 1}}甚至' ' < 'A'

比较字符串时,您比较所有字母,实际上返回第一个不同字符的结果,就像在字典中一样('0' < 'A'hello之前manual之前table。 1}})。

答案 2 :(得分:0)

char实际上只是一个1字节的数字,系统使用格式将其解释为一个字符(我相信它的ASCII,但我可能会非常错误,所以有人请纠正我,如果它&#39 ;不是这样的)。例如,在ASCII中:

a是97,b是98

A是65,B是66

所以你可以说&#39; a&#39; &LT; &#39; B&#39;和&#39; A&#39; &LT; &#39;一个&#39;它按字母顺序排列。