请问一下在c++中,字符串比较时如==,!=,<,>,>=这些关系运算符到底比较的是字符串的什么?长度,还是ASSIC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问一下在c++中,字符串比较时如==,!=,<,>,>=这些关系运算符到底比较的是字符串的什么?长度,还是ASSIC相关的知识,希望对你有一定的参考价值。
码?
是依次比较字符串中字符的ASSIC码2.3.3 字符串常量
字符串常量是用一对双引号括起来的字符序列。例如:
"This is a character string."
与单引号在字符常量中的作用相同,双引号在这里也仅是作为定界符,它本身不是字符串常量的内容。若在字符串常量中需要出现双引号则必须使用转义序列。例如:
"I say: \"Here need a desk.\""
所表示的字符串为
I say: "Here need a desk."
在C++语言中,字符串的存储方式比较特殊。一个字符串常量并不是一系列字符常量的简单排列,系统会在每一个字符串常量的尾部加上一个字符常量'\0',表示“该字符串常量到此结束”。字符常量'\0'是一个值为0的ASCII字符,在ASCII码表中,称它为NULL。
例如,字符串常量"C++ language"共有12个字符,但它要占据13字节的存储单元,如图 2 1所示。因此,一个字符串常量所占的存储单元总是比它的字符个数多一个字节。
43 2b 2b 20 6c 61 6e 67 75 61 67 65 \0
图 2 1 字符串常量的存储形式
应当指出的是,在字符串常量中使用转义序列时,要注意防止出现二义性。例如:
cout<<"\x7Error!";
其原意是先使计算机的喇叭响一声,然后显示“Error!”6个字符。但实际执行的结果是在屏幕上显示:
~error!
且无喇叭响声。
这是由于编译器将7和E连在一起,将它们解释成'\x7E',而十六进制的7E正好是字符'~'的ASCII码值,于是就会出现以上的现象。这时,就是把\x7改写成\x07也不能改变这种现象,这是由于C++将转义序列看作是一个整型数据,转义序列甚至可以由4位十六进制数组成。
此列可以采用以下方法来解决:
cout<< "\x7 Error! ";
即用一个空格将转义序列字符与其它字符分隔开来,明确地将它们分为两个词法单元。或者干脆将它们分成两个常量输出:
cout<< '\x7' << "Error! ";
5.3 字符数组与字符串
字符是计算机程序经常处理的数据。字符在计算机中以ASCII码的形式存放,每个字符占一个字节。对于一个语言系统,字符串是指若干有效字符的序列。字符串常量是由双引号相括的字符序列表示。例如,
"CHINA" "Student" "x+y=100" "\a\n" " " ""
都是合法的字符串。以空格组成的字符串不是空串,空格也是字符。
5.3.1 字符串存储
通常可用字符数组存放字符串。例如,
char str[10];
表示str是一个字符型数组,可以存放10个字符。可以把串"CHINA"赋值给str:
str[0] = 'C'; str[1] = 'H'; str[2] = 'I'; str[3] = 'N'; str[4] = 'A';
为了表示一个字符串的结束位置,可以用'\0'作为标志:
str[5] = '\0';
程序处理中,检测到'\0',就认为一个字符串结束了。
'\0'是指ASCII码值为0的字符,它不是一个普通的可显示字符,而是代表一个空操作的标记。'\0'可以用赋值方式赋给字符数组的元素。只有一个'\0'的字符数组虽然没有可显示字符,但仍然占有一个存储单元。
声明一个字符数组时,有不同的初始化方式。
① 逐个字符对数组元素进行赋初始值:
char str1[10] = 'S', 't', 'u', 'd', 'e', 'n', 't' ;
这种方式的初始化不会添加结束符'\0'。
② 用串常量初始化:
char str2[10] = "Student";
char str3[] = "Student";
或者省略:
char str3[] = "Student";
C对串常量自动添加结束标志'\0',所以str2[7] = '\0'。str3由串常量定义串的长度,str3有8个元素。
5.3.2 字符串处理函数
C++提供的字符串处理函数在string.h的头文件中声明。下面介绍一些常用的字符串处理的函数的原型、功能和使用方法。
1、字符串长度函数strlen( )
函数原型:int strlen(const char *s);
功能:返回字符指针s所指的字符串长度。这里,暂时将const char *s理解为const char s[](下同)。只计算有效字符个数,空字符不包括在内。
【例5- 3】测试字符串长度。
#include <iostream.h>
#include <string.h>
void main()
char str1[] = "How do you do !";
char *str2 = "Fine.";
cout<<"The string1 length is: "<<strlen(str1)<<endl;
cout<<"The string2 length is: "<<strlen(str2)<<endl;
cout<<"The string3 length is: "<<strlen("C++ program")<<endl;
运行结果为:
The string1 length is: 15
The string1 length is: 5
The string1 length is: 11
2、字符串赋值函数strcpy( )
函数原型:char * strcpy(char *s1, const char *s2);
功能:将s2所指的字符串复制到s1所指的字符数组中,函数返回值是s1串的地址。使用函数时应注意,定义串长strlen(s1)≥strlen(s2)。
【例5- 4】复制字符串。
#include <iostream.h>
#include <string.h>
void main()
char str1[]="Happy birthday to you";
char str2[25];
cout<<"The string in array str1 is: "<<str1
<<"\nThe string in array str2 is: "<<strcpy(str2,str1)
<<'\n';
运行结果为:
The string in array str1 is: Happy birthday to you
The string in array str2 is: Happy birthday to you
3、字符串连接函数strcat( )
函数原型:char * strcat(char *s1, const char *s2);
功能:把s2所指的字符串添加到s1所指的字符串之后。函数返回s1串的地址。为了s1所指的空间能容纳s2串的所有字符,应该有s1定义长度≥strlen(s1)+strlen(s2)+1。
【例5- 5】字符串连接。
#include <iostream.h>
#include <string.h>
void main()
char s1[ 20 ] = "Happy ";
char s2[] = "New Year ";
char s3[ 40 ] = "";
cout << "s1 =" << s1 << "\ns2 =" << s2;
cout << "\nstrcat(s1, s2) = "<< strcat( s1, s2 );
cout << "\nstrcat(s3, s1) = "<< strcat( s3, s1 ) << endl;
程序运行结果如下:
s1 =Happy
s2 =New Year
strcat(s1,s2) = Happy New Year
strcat(s3,s1) = Happy New Year
4、字符串比较函数strcmp( )
函数原型:int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, int n);
功能:以字典顺序方式比较两个字符串是否相等。如果两个串相等,函数返回值为0;如果s1串大于s2串,返回值大于0;如果s1串小于s2串,返回值小于0。函数strcmp用于对两个串的完全比较;函数strncmp用于比较两个串的前n个字符。
【例5- 6】字符串比较。
#include <iostream.h>
#include <string.h>
#include <iomanip.h>
void main()
char s1[] = "Happy New Year";
char s2[] = "Happy New Year";
char s3[] = "Happy Holidays";
cout << "s1 = " << s1 << "\ns2 = "<< s2
<< "\ns3 = "<< s3 << "\n\nstrcmp(s1, s2) ="
<< setw( 2 ) << strcmp( s1, s2 )
<< "\nstrcmp(s1, s3) = "<< setw( 2 )
<< strcmp( s1, s3 ) << "\nstrcmp(s3, s1) ="
<< setw( 2 ) << strcmp( s3, s1 );
cout << "\n\nstrncmp(s1, s3, 6) = "<< setw( 2 )
<< strncmp( s1, s3, 6) << "\nstrncmp(sl, s3, 7) ="
<< setw( 2 ) << strncmp( s1, s3, 7 )
<< "\nstrncmp(s3, s1, 7) ="
<< setw( 2 ) << strncmp( s3, s1, 7 ) << endl;
程序运行结果如下:
s1 = Happy New Year
s2 = Happy New Year
s3 = Happy Holidays
strcmp(s1, s2) = 0
strcmp(s1, s3) = 1
strcmp(s3, s1) = -1
strncmp(s1, s3, 6) = 0
strncmp(s1, s3, 7) = 1
strncmp(s3, s1, 7) = -1
5、输入串
用cin流输入字符串时,C++把键盘操作的空格或回车都视为结束,因此无法输入带空格的字符串。C语言的函数gets接受键盘输入的空格,以回车作为结束。
函数puts输出字符串。函数gets和puts在stdio.h文件声明。
【例5- 7】输入带空格的字符串。
#include <iostream.h>
#include <stdio.h>
void main()
char str[10];
gets(str);
puts(str);
2.5 基本运算符
运算是对数据的加工过程,描述各种不同运算的符号叫做运算符,而参与运算的数据叫做操作数。表 2 6列出了C++语言运算符的功能、优先级和结合性。
表 2 6 C++语言常用运算符的功能、优先级和结合性
优先级 运算符 功能 结合性
1 () 改变优先级 左→右
:: 作用域运算
[] 数组下标
. -> 成员运算
.* ->* 成员指针选择
2 ++ -- 自增,自减 右→左
& 取地址
* 取内容
! 逻辑反
~ 按位反
+ - 取正,取负
() 强制类型
sizeof 求存储字节
new delete 动态分配,释放内存
3 * / % 乘,除,求余 左→右
4 + - 加,减
5 << >> 左移位,右移位
6 <= >= 小于等于,大于等于
7 = = != 等于,不等于 左→右
8 & 按位与
9 ^ 按位异或
10 | 按位或
11 && 逻辑与
12 || 逻辑或
13 ? : 条件运算 右→左
14 = += -= *= /= %= &= ^= 赋值,复合赋值
15 , 逗号运算 左→右
运算符的优先级与我们日常数学中意义相同,它决定了一个表达式的运算顺序。运算符的结合性则决定了该运算符对其操作数的运算顺序:如果一个运算符对其操作数自左向右的执行规定的运算,则称该运算是右结合的;反之则称其为左结合的。
按运算符所要求操作数的个数,运算符可以分为单目运算符、双目运算符和三目运算符。单目运算符要求有一个操作数,双目运算符要求有两个操作数,而三目运算符则要求有三个操作数。
按运算符的运算性质,运算符又可以分为算术运算符、关系运算符、逻辑运算符、位运算符和其它运算符。本节介绍C++语言中的算术运算符、关系运算符、逻辑运算符、位运算符和sizeof运算符,其余的运算符将在后续章节中逐步介绍。
1、 算术运算符
C++语言中的算术运算符包括单目算术运算符
-(负号)
和双目算术运算符:
+(加) -(减) *(乘) /(除) %(模)
双目运算符%其作用是取被除数除以除数后的余数,符号和被除数的符号相同。
【例2- 1】测试双目运算符%。
#include <iostream.h>
void main()
cout<<"8%5="<<8%5<<endl;
cout<<"8%(-5)="<<8%(-5)<<endl;
cout<<"(-8)%5="<<(-8)%5<<endl;
cout<<"(-8)%(-5)"<<(-8)%(-5)<<endl;
运行结果为:
8%5=3
8%(-5)=3
(-8)%5=-3
-8)%(-5)=-3
运算符“%”要求它的两个操作数必须都是整型或字符型数据,而其它算术运算符则可以是任何基本数据类型。需要指出的是,若运算符“/”的两个操作数均为整型数据时,进行的是整除,运算结果即商也是一个整型值,小数部分被自然舍弃了,比如,8/5的结果为1,而5/8的结果为0。
进行算术运算时,很可能溢出结果。发生溢出是由于一个变量被赋予一个超出其数据类型表示范围的数值。只要分母不为0也不会引起除0运行故障,数值溢出是不会引起编译错误的,但会使运行结果发生偏差。
例如,在16位机器上进行下面的操作:
int weight = 42896;
在16位机器中将不能得到值42896,而是-22640。因为在16位机器中有符号整数的表示范围是-32768~32767,所以它只能得到42896的补码-22640(42896-65536)。
一个整型变量,用任何一个超过表示范围的整数初始化,得到的值为用该整数范围作模运算后的值。例如:
int weight = 142896;
则当weight是2字节整型数时,得到值为11824。因为142896 = 2*65536+11824。而142896- 3*65536= -53712,该数不在有符号整型数表示范围内。
2、 关系运算符
C++语言中的关系运算符都是二元运算符,它们一共有6个:
<(小于) <=(不小于) >(大于) >=(不大于) ==(等于) !=(不等于)
6个关系运算符中除大于和小于外的4个运算符的写法,它们都是双字符符号,键入这样的符号时,两个字符间不得有任何分隔符。另外注意等于关系运算符,它由两个等号组成,与赋值运算符形式不同。
关系运算符是用来对两个操作数进行关系比较的。由于信息在计算机中均是以二进制数的形式存储的,因此,关系比较实质上就是比较两个操作数的大小。当两个操作数满足关系运算符所要求的比较关系时,其结果为1,相当于逻辑真;否则为0,相当于逻辑假。
关系运算的结果可以用在算术运算中,例如:
i<=(3<5)+8;
则i的值为9。
由于算术运算符的优先级高于关系运算符,所以,上例中若去掉圆括号,编译器将解释为
i=3<(5+8);
这是,i的值为1。
3、 逻辑运算符
C++语言中的逻辑运算符包括单目逻辑运算符
!(逻辑非)
和双目逻辑运算符:
&&(逻辑与) ||(逻辑或)
逻辑运算符是用来表示两个操作数的逻辑关系的。运算结果用1和0分别表示逻辑真和逻辑假,运算结果也可以作为一个整型数值用于算术运算中。
(1)逻辑非 当操作数的值为0时,对该操作数逻辑非运算的结果为真;否则为假。例如,设整型变量i和j的值分别为0和-30,则!i和!j的运算结果分别为1和0。
(2)逻辑与 只要两个操作数中有一个操作数的值为0,则对它们逻辑与运算的结果就为假。例如,设i和j仍为上述值,则i&&j的运算结果为0。
(3)逻辑或 只要两个操作数中有一个操作数的值不为0,则对它们逻辑或运算的结果就为真。例如,设i和j仍为上述值,则i||j的运算结果为1。
逻辑运算符的操作数可以是任何基本数据类型的数据。
4、 位运算符
C++语言中的位运算符包括单目运算符
~(位求反)
和双目运算符:
&(位与) |(位或) ^(位异或) <<(左移) >>(右移)
位运算符是对其操作数按其二进制形式逐位的进行逻辑运算或移位操作的。
例如:
unsigned char a=135, b= 43;
变量a和b的二进制表示分别为1000 0111和0010 1011。
按位求反 运算符“~”将其操作数逐位取其反码,即将原来为1的位变为0,原来为0的位变为1。例如,按位求反~a的结果为0111 1000,即十进制120。
按位与 运算符“&”将其两个操作数对应位逐一的进行逻辑与运算。两个一位二进制数逻辑与运算的规则为,两个数中只要有一个为0,则逻辑与的结果就为0。例如,按位与运算a&b的结果为0000 0011,即十进制的3。
a 1000 0111
b 0010 1011
a&b 0000 0011
按位或 运算符“|”将其两个操作数作对应位逐一进行逻辑或运算。两个一位二进制数逻辑或运算的规则为,两个数中只要有一个为1,则其逻辑或的结果就为1。例如,按位或运算a|b的结果为1010 1111,即十进制的175。
a 1000 0111
b 0010 1011
a|b 1010 1111
按位异或 运算符“^”将其两个操作数作对应位逐一的进行逻辑异或运算。两个一位二进制数逻辑异或运算的规则为,两个数只要不同,则其逻辑异或的结果就为1,否则就为0。例如,位运算a^b的结果为1010 1100,即十进制的172。
a 1000 0111
b 0010 1011
a^b 1010 1100
按位左移 运算符“<<”将其左操作数向左移动其右操作数所指定的位数,移出的位补0。由于移位运算符的右操作数表示的是欲移动的位数,所以,它必须是一个整型表达式。例如,移位运算b<<1的结果为0101 0110,即十进制的86;而位移运算b<<2的结果为1010 1100,即十进制的172。可以看出:将一个数左移一位,相当将该数乘以2;左移两位,相当将该数乘以4。一般说来,将一个数左移n位,就相当将该数乘以2n。所以,在程序中,常用左移位来进行快速的乘法运算。
用移位方法进行乘法运算时,同样要注意溢出问题。若被移位的是一个有符号数,移位后可能使该数的符号发生变化,这一点对右移运算同样适用。
按位右移 运算符“>>”将其左操作数向右移动其右操作数所指定的位数,移出的位补0。例如,位移运算a<<2的结果为0010 0001,即十进制的33。与左移操作相对应:将一个数右移n位,相当于将该数除以2n,其小数部分将被忽略。这与整型和字符型数据的除法运算完全一致,所以在程序中常用右移来进行快速的除法运算。
根据位运算符的操作性质可见,位运算符的操作数的数据类型必须是整型或字符型,不得是实型数据。
5、 sizeof
sizeof运算符是一个单目运算符,它是用来计算其操作数在内存中所占的字节数的,其运算结果是一个无符号整型值。sizeof运算符的用法具有以下的一般格式:
sizeof(表达式)
其中表达式通常是一个变量或是一个数据类型。C++语言提供sizeof运算符是为了提高程序的移植性。因为在不同的机器上或C++语言的不同实现中,以及不同的操作系统中,同一数据类型所占的内存大小不尽相同。利用该运算符,可以使得程序员在涉及到内存计算时,不必考虑机器的具体型号和语言的具体实现以及所使用的操作系统。 参考技术A ASCII码
根据字符串中的字符顺序比较..比较的是这些字符的ASCII码大小.
如果前面的字符都一样..则更长的字符串更大
比如两个字符串.."badfjklj" "bfjkljljfhjk"
首先比较两个串的第一个字符b和b比较..相同则比较第二个字符a和f比较..a字符ASCII码排位在f前面..所以这两个字符串 第一个字符串大, 串1 > 串2
再比如两个字符串.."gfdsa" "gfdsakkkkk" 这两个字符串前面的所有都相同..第二个字符串更长.所以第二个字符串大, 串2 > 串1
所有都相同就是 ==本回答被提问者采纳 参考技术B char 型字符串,不可以用 这些算法来比较。语法检查可能不报错,运算结果却不对。
char 型字符串用 strcmp() 或 strncmp() 函数来比较。
单个char 型字符 可以用这些运算符比较,因为单个char 型字符可以看成是1字节整型数(ASCII 值)。
string 类 也许可以用 这些算法来比较,取决于编译器。最保险的还是用
string 类的 compare函数来比较。
字符串大小 比 ASCII 值。也兼顾长度,例如 "ABCD" 大于 "ABC".
相等和不等,看 字符串 一样 还是不一样。 参考技术C 一般默认算法中.是先首字母.然后才是长度
以上是关于请问一下在c++中,字符串比较时如==,!=,<,>,>=这些关系运算符到底比较的是字符串的什么?长度,还是ASSIC的主要内容,如果未能解决你的问题,请参考以下文章