Chinaunix

标题: 问个比较弱的问题 [打印本页]

作者: 恋夏寒    时间: 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的?   不是应该相等的吗?  难道这结果又是根据编译器和环境不同而不同的?
作者: gawk    时间: 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 编辑 ]
作者: bood    时间: 2008-08-27 11:22
还有行号,就不帮你测试了……
怀疑这句有问题:
s1==s2=='\0'

相当于(s1==s2)=='\0',第二次比较都是将一个bool与一'\0'比较,而'\0'是false吧?
作者: 恋夏寒    时间: 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]]
作者: gawk    时间: 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  ----->>>>  似乎这个条件才能得出想要的 ...

楼主你应该看一下书,发现你把指针和字符串中的内容没有理清,还有看一下操作符优先级那一章
作者: 恋夏寒    时间: 2008-08-27 11:49
原帖由 gawk 于 2008-8-27 11:46 发表

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



好的,谢谢提醒。
作者: Godbach    时间: 2008-08-27 13:50
10    if (s1==s2=='\0')
这样写你觉得会是什么样的结果呢
作者: xp5211314    时间: 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')
楼主好好斟酌一下啊
作者: huangwei0413    时间: 2008-08-27 17:22
标题: 回复 #1 恋夏寒 的帖子
第三个测试还有其他问题,字符串结束符在数组中不存在
作者: 恋夏寒    时间: 2008-08-27 17:32
原帖由 Godbach 于 2008-8-27 13:50 发表
10    if (s1==s2=='\0')
这样写你觉得会是什么样的结果呢



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

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



但上面4钟不同的判断,区别又在哪啊?
作者: 恋夏寒    时间: 2008-08-27 17:35
原帖由 huangwei0413 于 2008-8-27 17:22 发表
第三个测试还有其他问题,字符串结束符在数组中不存在



如果字符串结束符在数组中不存在的话, 前面的while循环就已经不成立了。
作者: 山外山    时间: 2008-08-27 18:10
if (s1=='\0' && s2=='\0')
作者: fera    时间: 2008-08-29 14:09
如果只用equalstring()的话,这说明你的函数设计不好,通用性差。用strcmp:
bool StringCompare(const char * s1, const char * s2)
{
    while (*s1++ !=*s2++)
        return *s1 - *s2;
}
作者: fera    时间: 2008-08-29 14:09
原帖由 fera 于 2008-8-29 14:09 发表
如果只用equalstring()的话,这说明你的函数设计不好,通用性差。用strcmp:
bool StringCompare(const char * s1, const char * s2)
{
    while (*s1++ !=*s2++)
        return *s1 - *s2;
}


声明:这只是最简化版。
作者: fera    时间: 2008-08-29 14:13
纯C:
int StringCompare(const char * s1, const char * s2)
{
    while ( (*s1 && *s2) && *s1++ == *s2++ )
        ;
    return *s1 - *s2;
}
作者: kewenliang    时间: 2008-08-29 17:05
  1. if(s1[i]==s2[i]=='\0')
复制代码
改为:
  1. if ((s1[i]=='\0')&&(s2[i]=='\0'))
复制代码

即得正确结果。
作者: 0vk0    时间: 2008-08-29 17:40
s1==s2=='\0'

判断语句最好不要连续这样,连续用==




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2