字符串数组的比较
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可以用來比較字符串的内容