免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2844 | 回复: 16
打印 上一主题 下一主题

[C] 问个比较弱的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 11:00 |只看该作者 |倒序浏览
检验字符串是否相等:

[code]
1 #include <stdio.h>
  2 #include <stdbool.h>
  3
  4 bool equalstring(const char s1[], const char s2[])
  5 {
  6    bool flag;
  7    int i=0;
  8    while (s1[i]==s2[i]&&s1[i]!='\0'&&s2[i]!='\0')
  9       i++;
10    if (s1[i]==s2[i]=='\0')
11       flag=true;
12    else
13       flag=false;
14    return flag;
15 }
16
17 int main()
18 {
19    bool equalstring(const char s1[], const char s2[]);
20    const char str1[]="test string";
21    const char str2[]="string";
22    printf("%i\n",equalstring(str1, str1));
23    printf("%i\n",equalstring(str1, str2));
24    printf("%i\n",equalstring(str2, "string"));
25 }
[/code]

Env: Linux ;  GCC version 4.1.2

运行结果是: 0 1 0  
问题: 为什么第三个:str2[]="string"和字符串常量"string"比较后,结果是false的?   不是应该相等的吗?  难道这结果又是根据编译器和环境不同而不同的?

论坛徽章:
0
2 [报告]
发表于 2008-08-27 11:16 |只看该作者
第10行检查一下
其实也必要这样写

  1. if (s1[i]==s2[i])
  2.      flag=true;
  3.    else
  4.      flag=false;
复制代码

[ 本帖最后由 gawk 于 2008-8-27 14:23 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-08-27 11:22 |只看该作者
还有行号,就不帮你测试了……
怀疑这句有问题:
s1==s2=='\0'

相当于(s1==s2)=='\0',第二次比较都是将一个bool与一'\0'比较,而'\0'是false吧?

论坛徽章:
0
4 [报告]
发表于 2008-08-27 11:43 |只看该作者
第10行的判断:

1. if (s1==s2)  结果: 1 0 0

2. if (s1[i]==s2[i])  结果 1 0 1

3. if (s1[i]=='\0' && s2[i]=='\0')  结果 1 0 1

4. if (s1==s2=='\0') 结果 0 1 1  ----->>>>  似乎这个条件才能得出想要的结果,但为什么呢? 这又与“if (s1[i]==s2[i]=='\0')”有啥区别呢?

[[i] 本帖最后由 恋夏寒 于 2008-8-27 11:45 编辑 [/i]]

论坛徽章:
0
5 [报告]
发表于 2008-08-27 11:46 |只看该作者
原帖由 恋夏寒 于 2008-8-27 11:43 发表
第10行的判断:

1. if (s1==s2)  结果: 1 0 0

2. if (s1==s2)  结果 1 0 1

3. if (s1=='\0' && s2=='\0')  结果 1 0 1

4. if (s1==s2=='\0') 结果 0 1 1  ----->>>>  似乎这个条件才能得出想要的 ...

楼主你应该看一下书,发现你把指针和字符串中的内容没有理清,还有看一下操作符优先级那一章

论坛徽章:
0
6 [报告]
发表于 2008-08-27 11:49 |只看该作者
原帖由 gawk 于 2008-8-27 11:46 发表

楼主你应该看一下书,发现你把指针和字符串中的内容没有理清,还有看一下操作符优先级那一章



好的,谢谢提醒。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2008-08-27 13:50 |只看该作者
10    if (s1==s2=='\0')
这样写你觉得会是什么样的结果呢

论坛徽章:
0
8 [报告]
发表于 2008-08-27 14:17 |只看该作者
原帖由 bood 于 2008-8-27 11:22 发表
还有行号,就不帮你测试了……
怀疑这句有问题:
s1==s2=='\0'

相当于(s1==s2)=='\0',第二次比较都是将一个bool与一'\0'比较,而'\0'是false吧?



验证了一下总觉得lz的程序有问题,起码得出的结果不是我们想要的  原因就是在你这个判断上面 if (s1==s2=='\0')
楼主好好斟酌一下啊

论坛徽章:
0
9 [报告]
发表于 2008-08-27 17:22 |只看该作者

回复 #1 恋夏寒 的帖子

第三个测试还有其他问题,字符串结束符在数组中不存在

论坛徽章:
0
10 [报告]
发表于 2008-08-27 17:32 |只看该作者
原帖由 Godbach 于 2008-8-27 13:50 发表
10    if (s1==s2=='\0')
这样写你觉得会是什么样的结果呢



请问你所指的结果是什么意思呢?

我上面试了 得出结果是 0 1 1啊!



但上面4钟不同的判断,区别又在哪啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP