59-C++C-风格字符串的比较

                                  C-风格字符串的比较

假设要直到字符数组中的字符串都不是mate。如果word是数组名,下面的测试可能并不能像我们预想的那样工作:

word == “mate”

请记住,数组名是数组的地址。同样,用引号括起的字符串常量也是其地址。因此,上面的关系表达式不是判断两个字符串是否相同,而是查看它们是否存储在相同的地址上,两个字符串的地址是否相同呢?答案是否定的,虽然它们包含相同的字符。

由于C++将C-风格字符串视为地址,因此如果使用关系运算符来比较它们,将无法得到满意的结果。相反,应使用C-风格字符串库中的strcmp()函数来比较。该程序接受两个字符串地址作为参数。这意味着参数可以是指针,字符串常量或字符数组名。如果两个字符串相同,该函数将返回零;如果第一个字符串按字母顺序排在第二个字符串之前,则strcmp()将返回一个负数值;如果第一个字符串按字母顺序排在第二个字符串之后,则strcmp()将返回一个正数值。实际上,“按系统排列顺序“比“按字母顺序”更准确。这意味着字符是根据字符的系统编码来进行比较的。例如,使用ASCII码时,所有大写字母的编码都比小写字母小,所以按排列顺序,大写字母将位于小写字母之前。因此,字符串“Zoo”咋字符串”aviary”之前,根据编码进行比较还以为着大写字母和小写字母是不同的,因此字符串”FOO”和字符串”foo”不同。

在有些语言(如BASIC和标准Pascal)中,存储在不同长度的数组中的字符串彼此不相等。但是C-风格字符串是通过结尾的空值字符定义的,而不是有其所在数组的长度定义的。这意味着两个字符串即使被存储在长度不同的数组中,也可能是相同的。

char big[80] = “Daffy”;

char little[6] = “Daffy”;

顺便说一句,虽然不能用关系运算符来比较字符串,但却可以用它们来比较字符,因为字符实际上是整型。因此下面的代码可以用来显示字符表中的字符,至少对于ASCII字符集和Unicode字符集来说是有效的:

for (ch = ‘a’;ch <=’z’;ch++)

    cout<<ch;

下列程序在for循环的测试条件中使用了strcmp()。该程序显示一个单词,修改其首字母,然后再次显示这个单词,这样循环往复,直到strcmp()确定该单词与字符串”mate”相同为止。注意,该程序包含了文件cstring,因为它提供了strcmp()函数的原型。

//compstr1.cpp——comparing strings using arrays 
#include<iostream>
#include<cstring>
int main()
{
    using namespace std;
    char word[5] = "?ate";
    for(char ch = 'a' ; strcmp(word , "mate"); ch++)
    {
    	cout<<word<<endl;
    	word[0] = ch;
	}
	cout<<"After loop ends,word is "<<word<<endl;
    return 0;

}

下面是该程序的输出:

程序说明

该程序有几个有趣的地方。其中之一当然是测试。我们希望只要word不是mate,循环就继续进行。也就是说,我们希望只要strcmp()判断出两个字符串不相同,测试就继续进行。最显而易见的测试是这样的:

strcmp(word , “mate”) !=0;

如果字符串不相等,则该语句的值为1(ture),如果字符串相等,则该语句的值为0(false)。但使用strcmp(word , “mate”) 本身将如何呢?如果字符串不相等,则它的值为非零(true):如果字符串相等,则它的值为零。实际上,如果字符串不同,该返回true,否则返回false。因此,可以只用这个函数,而不是整个关系表达式。这样得到的结果将相同,还可以少输入几个字符。另外,C和C++程序员传统上就是用这种方法使用strcmp()的。

                                      检测相等或排列顺序:

    可以使用strcmp()来测试C-风格字符串是否相等(排列顺序)。如果str1和str2相等,则下面的表达式为true:

         strcmp(str1,str2) !=0;

         strcmp(str1,str2)

  如果str1在str2前面,则下面的表达式为true:

         strcmp(str1,str2)<0

  如果str1在str2的后面,则下面的表达式为true:

        strcmp(str1,str2)>0

  因此,根据要如何设置测试条件,strcmp()可以扮演==、!=、<和>运算符的角色。

  接下来,compstr1.cpp使用递增运算符使变量ch遍历字母表:

       ch++;

  可以对字符变量使用递增运算符和递减运算符,因为char类型实际上是整型,因此这种操作实际上将修改存储在变量中的整数代码。另外,使用数组索引可使修改字符串中的字符更为简单;

    word[0] = ch;

猜你喜欢

转载自blog.csdn.net/qq_41200424/article/details/82594542