首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

字符串数组的比较解决办法

2012-02-13 
字符串数组的比较charstr1[]abc charstr2[]abc constcharstr3[]abc constcharstr4[]abc c

字符串数组的比较
char   str1[]   =   "abc ";
char   str2[]   =   "abc ";
const   char   str3[]   =   "abc ";  
const   char   str4[]   =   "abc ";  
const   char*   str5   =   "abc ";
const   char*   str6   =   "abc ";

cout   < <   boolalpha   < <   (   str1==str2   )   < <   endl;  
cout   < <   boolalpha   < <   (   str3==str4   )   < <   endl;  
cout   < <   boolalpha   < <   (   str5==str6   )   < <   endl;  

请问为什么str1!=tr2,   str3!=str4   and   str5   ==   str6s?

[解决办法]
char str1[] = "abc ";
char str2[] = "abc ";
str1和str2都是字符数组,它们在栈上申请空间,每个数组都是4个字节,它们各指向自己的数组,当然不相等。

const char str3[] = "abc ";
const char str4[] = "abc ";
理由同上

const char* str5 = "abc ";
const char* str6 = "abc ";
str5和str6指向的都是常量 "abc ", "abc "在常量区,很多编译器对于内容一样的字符串常量,只保留一份,因此这里str5和str6在大多数编译器上都是相等的。但这不是绝对的,如果编译器作者把两个 "abc "保存在常量区的不同位置,显然str5和str6也不会相等。

字符串内容的比较使用strncmp()或strcmp()。



[解决办法]
char str1[] = "abc ";
char str2[] = "abc ";

const char str3[] = "abc ";
const char str4[] = "abc ";

都是分别开辟开辟自己的空间储存abc ,他们的地址不一样 ,所以str1!=tr2, str3!=str4

而str5 str6都指向同一abc首地址,所以相等。
[解决办法]
用strcmp()函数进行比较
数组名的类型,编译器解释成指向数组首元素的指针,你比较的是指针的值,也就是地址之间的大小,str1,str2,str3,str4都是栈上分配的不同的内存区域,所以地址不同,而str5,str6都是指向常量的指针,为了节省内存消耗,编译器对静态存储区的文本常量进行了“常量折叠”,相同常量只存一份,所以二者地址的相同,指向静态存储区的同一块内存的地址
[解决办法]
strX==strY

这样的比较,
实际上不是比较 字符串的内容,
而是比较了 字符串的 首地址, 也就是他们的指针!!

既然是比较地址,
那么显然 str1!=tr2, str3!=str4, 因为它们都是相对独立的 栈数组,
都有自己的空间, 那么比较地址自然就是不一样的。

str5 == str6
这个要看具体情况,
一种, 环境设置了 编译优化,
那么对于相同的常量, 环境将对其进行优化, 只保存一份内容,
使用不同的指针引用该内容,
这样, 得到的结果就是 str5 == str6, 因为它们都指向了 同一份内存内容;
另外一种情况,
如果不选择优化,
那么 和栈数组一样, str5 != str6
[解决办法]
cout < < boolalpha < < ( str1==str2 ) < < endl;
cout < < boolalpha < < ( str3==str4 ) < < endl;
cout < < boolalpha < < ( str5==str6 ) < < endl;
==》
cout < < boolalpha < < ( str1==str2 ) < < endl;
cout < < boolalpha < < ( str3==str4 ) < < endl;
cout < < boolalpha < < ( str5==str6 ) < < endl;
cout < < boolalpha < < strcmp(str1, str2) < < endl; //比较字符串内容, 用strcmp函数
cout < < boolalpha < < strcmp(str3, str4) < < endl;
cout < < boolalpha < < strcmp(str5, str6) < < endl;
[解决办法]
你比较的只是指针哦。。
真正的比较字符串必须用strcmp
[解决办法]
char str1[] = "abc ";
char str2[] = "abc ";
分配两个数组空间,存放的内容为 "abc ",str1和tr2分别表示两个数组空间的首地址,当然不同。



const char str3[] = "abc ";
const char str4[] = "abc ";
原因和str1,str2相同。

至于第三个也不是很难理解,编译器认定str5和str6指向的是同一个地址,且不会改变(const),所以编译器使用引用记数(在这里也没什么意义,还是因为const)的方法做了优化,说明那个内存空间被使用了两次,从而节省了重复开辟内存所耗费的时间和空间。
[解决办法]
- -蟲子都講了
重復一下:
“==”是比較的2个字符串的地址
strcmp可以用來比較字符串的内容

热点排行