鱼C论坛

 找回密码
 立即注册
查看: 916|回复: 6

[已解决]小甲鱼c语言作业S1E22strcmp的判断问题

[复制链接]
发表于 2023-7-25 08:55:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        char str1[MAX],str2[MAX];
        char *t1 = &str1[0];
        char *t2 = &str2[0];
        int i = 0;
       
        printf("请输入第一个字符串str1的内容:");
        fgets(str1,MAX,stdin);
        printf("请输入第一个字符串str2的内容:");
        fgets(str2,MAX,stdin);
       
        while(1)
        {
                i++;
                if(*t1++ != *t2++)
                {
                        printf("有不一样的地方!第%d个字符不一样",i);
                        break;
                }
                if(*t1 == '\0' && *t2 =='\0')
                {
                        printf("完全一样");
                        break;
                }
        }
        return 0;
各位带佬,请问strcmp基础代码里判断字符完全一样的if语句( if(*t1 == '\0' &&*t2 == '\0'),if判断条件换成(*t1 == *t2 ==' \0'),代码就无法正常运行了呢?在判断不一样的字符串会反馈字符串一样
最佳答案
2023-7-25 08:55:53
本帖最后由 陶远航 于 2023-7-25 08:57 编辑

你提供的代码中,strcmp函数的判断完全一样的条件是if(*t1 == '\0' && *t2 =='\0'),这是正确的做法。

如果你将判断条件修改为if(*t1 == *t2 ==' \0'),它实际上是一个逻辑错误。这是因为 *t1 == *t2 ==' \0' 的表达式会被解释成两个比较操作符相连,即先比较 *t2 是否等于空字符 '\0',再将结果与 *t1 进行比较。

换句话说,b]*t1 == *t2 ==' \0'[/b] 等价于 [b ==' \0'/b]。这里的 [b[/b] 的结果只能是 0 或 1,然后将其与字符 '\0' 进行比较,这显然不是我们想要的判断完全一样的条件。

因此,正确的判断条件应该是if(*t1 == '\0' && *t2 =='\0'),其中 && 是逻辑与操作符,表示当 *t1*t2 都等于空字符时,才会满足条件判断为完全一样。

如果你使用了错误的条件判断语句,可能导致程序在判断不一样的字符串时错误地输出"完全一样"。请确保条件判断语句的逻辑正确性,以获得准确的结果。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-25 08:55:53 | 显示全部楼层    本楼为最佳答案   
本帖最后由 陶远航 于 2023-7-25 08:57 编辑

你提供的代码中,strcmp函数的判断完全一样的条件是if(*t1 == '\0' && *t2 =='\0'),这是正确的做法。

如果你将判断条件修改为if(*t1 == *t2 ==' \0'),它实际上是一个逻辑错误。这是因为 *t1 == *t2 ==' \0' 的表达式会被解释成两个比较操作符相连,即先比较 *t2 是否等于空字符 '\0',再将结果与 *t1 进行比较。

换句话说,b]*t1 == *t2 ==' \0'[/b] 等价于 [b ==' \0'/b]。这里的 [b[/b] 的结果只能是 0 或 1,然后将其与字符 '\0' 进行比较,这显然不是我们想要的判断完全一样的条件。

因此,正确的判断条件应该是if(*t1 == '\0' && *t2 =='\0'),其中 && 是逻辑与操作符,表示当 *t1*t2 都等于空字符时,才会满足条件判断为完全一样。

如果你使用了错误的条件判断语句,可能导致程序在判断不一样的字符串时错误地输出"完全一样"。请确保条件判断语句的逻辑正确性,以获得准确的结果。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-25 08:55:56 | 显示全部楼层
问题分析:

对于给出的代码,关键问题在于第一个if语句的判断条件 if(*t1 == *t2 ==' \0') 无法正确地判断字符串是否完全一样。

问题解释:

在C语言中,逻辑运算符 == 具有左结合性(left-associative),也就是说它会从左到右依次比较。因此,表达式 *t1 == *t2 ==' \0' 会先执行 *t1 == *t2 的比较操作,然后将其结果与 ' \0' 进行比较。这样的比较是错误的,因为一个字符(*t1*t2)不能与一个整型值(' \0')同时进行比较。

解决方案:

要正确判断字符串是否完全一样,可以将判断条件改为 if (*t1 == '\0' && *t2 == '\0')。这样,只有当两个指针所指的字符均为 \0(即字符串结束标志)时,才能判断字符串完全一样。

修改后的代码如下:
char str1[MAX],str2[MAX];char *t1 = &str1[0];char *t2 = &str2[0];int i = 0;printf("请输入第一个字符串str1的内容:");fgets(str1, MAX, stdin);printf("请输入第一个字符串str2的内容:");fgets(str2, MAX, stdin);while (1) {    i++;    if (*t1 != *t2) {        printf("有不一样的地方!第%d个字符不一样",i);        break;    }    if (*t1 == '\0' && *t2 == '\0') {        printf("完全一样");        break;    }    t1++;    t2++;}return 0;
通过以上修改,代码就能正确地判断两个字符串是否完全一样了。希望能对您有所帮助!如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-25 08:56:00 | 显示全部楼层
代码中出现的问题是这样的,当你使用  (*t1 == *t2 =='\0')  这样的语句时,C语言的求值顺序是从左到右。这个语句实际上会先比较  *t1  和  *t2  是否相等,如果相等,则结果为1,否则为0。然后将得到的结果(0 或 1)和  '\0'  (在C语言中实际为0)进行比较。这就意味着无论  *t1  和  *t2  的值为何,只要他们相等,那么整个表达式都将为真。

这样的结果显然并不是你希望得到的,你的目标是检查  *t1  和  *t2  是否都等于  '\0' 。因此,你需要使用  (*t1 == '\0' && *t2 == '\0')  这样的表达式来进行检查。这样,只有当  *t1  和  *t2  都等于  '\0'  时,整个表达式才会为真。

总的来说,这个问题是由于C语言的求值顺序和操作符优先级导致的。在使用复合条件语句时,需要特别注意这些问题,以避免出现不符合预期的行为。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-25 09:31:16 | 显示全部楼层
陶远航 发表于 2023-7-25 08:55
你提供的代码中,strcmp函数的判断完全一样的条件是if(*t1 == '\0' && *t2 =='\0'),这是正确的做法。

...

为啥楼下的都在说是先比较*t1 和*t2?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-25 09:32:03 | 显示全部楼层
WUHESAN 发表于 2023-7-25 09:31
为啥楼下的都在说是先比较*t1 和*t2?

你先试一试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-25 09:36:37 | 显示全部楼层

明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表