注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

字符串比较  

2010-04-05 21:37:00|  分类: 专业知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

首先,看下面的例子,想想究竟是怎么一回事?

#include <stdio.h>

int isequiv(char *t)

   if (t == "abc") 
        return 1;
    else
        return 0;
}

int main()
{
    char* str1="abc";
    char str2[]="abc";
    printf("%d", isequiv(str1));
    printf("%d", isequiv(str2)); 
    return 0;
}

上面程序段的输出结果:10。

修改一:isequiv函数中语句    if (t == "abc")        改为   char* chr = "char"; if (t == chr)

结果:10

修改二:isequiv函数中语句    if (t == "abc")        改为   char chr[] = "char"; if (t == chr)

结果:00

修改三:isequiv函数形参        char* t                 改为    char t[]

结果:10

对于上述结果的解释如下:

首先,分析语句if (t == "abc")  。不管t是数组名还是指针变量,变量t均存储的是地址。这句话的意思是变量t的地址和常量字符串“abc”的地址进行比较。

其次,分析语句char* str1="abc";和char str2[]="abc";

char* str1="abc";  变量str1存储的是字符串常量“abc”的地址。

char str2[]="abc"; 变量str2中存储的也是地址,这里的地址是在栈中分配的数组空间的首地址,数组的内容是abc。

再次,关于常量字符串的问题。好的编译器对于相同的常量字符串只存一份拷贝,即只占据一份空间。但是有的编译器是存放多份拷贝。

看到这里,应该能理解上述程序的结果了吧,而且咱用的编译器属于第一类啊。

出现上面这种混乱的状态,主要是字符串比较的疏忽导致,我们要比较的是字符串的内容,应该用strcmp比较。如果想用上面的语句进行比较的话,应该是用string类型的变量吧。
另外,针对上面的修改三,涉及到了形参类型问题(指针与数组),从上述的结果看,貌似指针和数组做形参是没什么区别的。


 

  评论这张
 
阅读(273)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018