关于C串的比较

CYJ_fightman 2017-09-18 10:08:33
#include<iostream>
using namespace std;

int main(){
cout<<"1."<<("join" == "join" ? "":"not ")<<"equal\n";

char buffer1[6] = "Hello";
char buffer2[6] = "Hello";
cout<<"\n2.buffer1 and buffer2 are "<<(buffer1 == buffer2 ? "" :"not ")<<"equal\n";
printf("buffer1地址是%p\n",&buffer1);
printf("buffer2地址是%p\n",&buffer2);

char* str1="good";
char* str2="good";
cout<<"\n3.str1 and str2 are "<<(str1 == str2 ? "":"not ")<<"equal\n";
printf("str1地址是%p\n",&str1);
printf("str2地址是%p\n",&str2);
if(!strcmp(str1,str2))
cout<<"In strcmp,str1 and str2 are equal\n";
return 0;
}

如这个程序所示,在书本上应该是三个都相等,因为它们的地址不一样,但是我用VC++运行结果却是:


求分析一下,不是说用“==”比较时候,如果地址不同会导致不相等吗?
...全文
297 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
CYJ_fightman 2017-09-22
  • 打赏
  • 举报
回复
我将题目整理一下,问题是这样子的,对于以下程序:
#include<iostream>
using namespace std;

int main(){
//---------------------------------------------------------
cout<<"1.\n"<<("join" == "join" ? "":"not ")<<"equal\n";
//---------------------------------------------------------


//---------------------------------------------------------
char buffer1[6] = "Hello";
char buffer2[6] = "Hello";
cout<<"\n2.\nIn \"==\",buffer1 and buffer2 are "<<(buffer1 == buffer2 ? "" :"not ")<<"equal\n";
if(!strcmp(buffer1,buffer2))
cout<<"In strcmp,buffer1 and buffer2 are equal\n";
printf("buffer1指向的地址是%p\n",buffer1);
printf("buffer2指向的地址是%p\n",buffer2);
//---------------------------------------------------------

//---------------------------------------------------------
char* str1="good";
char* str2="good";
cout<<"\n3.\nIn \" ==\",str1 and str2 are "<<(str1 == str2 ? "":"not ")<<"equal\n";
if(!strcmp(str1,str2))
cout<<"In strcmp,str1 and str2 are equal\n";
printf("str1指向的地址是%p\n",str1);
printf("str2指向的地址是%p\n",str2);
//---------------------------------------------------------

return 0;
}
其运行结果是:


问题是:
先看第一个:两个join,对于这两个join,系统会分别为其分配两块临时无名地址,而问题就是这两块地址是否相同?类似道理的,看第三个问题,str1和str2分别指向两块无名的临时地址,而我的疑问也是,为什么这两块地址值会相同呢?如果把str2指向“goodd”(改变一下字符串值),则分配的地址就不同了。


再看第二个:两个buffer数组的地址不同,但存储的内容相同,所以用“==”比较是not equal,用strcmp比较是equal(因为"=="比较的是地址值,而strcmp是逐个字符进行比较的,它们本质上就是不同的比较方式),所以这个没疑问;
CYJ_fightman 2017-09-22
  • 打赏
  • 举报
回复
不好意思。题目有一个字打错了。 原题是这样:“在比较两个C串的时候,会因为空间位置的不同而不同”,所以这个题目在书本上显示的输出应该是三个not equal即三个不相等,但是我实践后却只有第二个是not equal,而第一个join和第三个str1、str2是equal,试问怎么是怎么回事?
自信男孩 2017-09-21
  • 打赏
  • 举报
回复
地址值不相等,不能说明两个字符串不相等;
printf("str1地址是%p\n",&str1);
printf("str2地址是%p\n",&str2);
输出的这两个地址值肯定不相等,因为str1和str2是指针变量,系统会给每一个变量分配独立的内存。所以它们的地址值是不一样的。 但是str1和str2是指针变量,变量里存放的是地址值,这个地址值如果是一样的(对于这个题目),那么他们指向的内容(字符串)是一样的。建议打印一下str1和str2变量里的地址值
printf("str1地址是%p\n",str1);
printf("str2地址是%p\n",str2);
大米粥哥哥 2017-09-19
  • 打赏
  • 举报
回复
是变量指向的地址 而不是变量本身的地址
赵4老师 2017-09-19
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧