WUHESAN 发表于 2023-7-25 08:55:38

小甲鱼c语言作业S1E22strcmp的判断问题

        char str1,str2;
        char *t1 = &str1;
        char *t2 = &str2;
        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' 等价于 ==' \0'/b]。这里的 的结果只能是 0 或 1,然后将其与字符 '\0' 进行比较,这显然不是我们想要的判断完全一样的条件。

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

如果你使用了错误的条件判断语句,可能导致程序在判断不一样的字符串时错误地输出"完全一样"。请确保条件判断语句的逻辑正确性,以获得准确的结果。
如果问题已经解决,请设置最佳答案

Mike_python小 发表于 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,str2;
char *t1 = &str1;
char *t2 = &str2;
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;


通过以上修改,代码就能正确地判断两个字符串是否完全一样了。希望能对您有所帮助!如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 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语言的求值顺序和操作符优先级导致的。在使用复合条件语句时,需要特别注意这些问题,以避免出现不符合预期的行为。

WUHESAN 发表于 2023-7-25 09:31:16

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

...

为啥楼下的都在说是先比较*t1 和*t2?

陶远航 发表于 2023-7-25 09:32:03

WUHESAN 发表于 2023-7-25 09:31
为啥楼下的都在说是先比较*t1 和*t2?

你先试一试

WUHESAN 发表于 2023-7-25 09:36:37

陶远航 发表于 2023-7-25 09:32
你先试一试

明白了
页: [1]
查看完整版本: 小甲鱼c语言作业S1E22strcmp的判断问题