鱼C论坛

 找回密码
 立即注册
查看: 1670|回复: 3

[已解决]strcmp的一个问题

[复制链接]
发表于 2017-12-11 22:08:41 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Hermione 于 2017-12-11 22:11 编辑

这是我的错误代码:
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <string>
  5. #include <cstring>
  6. #define MAX 1024
  7. using namespace std;

  8. int main()
  9. {
  10.     char v1[MAX];
  11.     char v2[MAX];
  12.     char *a = v1;
  13.     char *b = v2;
  14.     cout << "字符串1:";
  15.     fgets(v1, MAX, stdin);
  16.     cout << "字符串2:";
  17.     fgets(v2, MAX, stdin);
  18.     char ch;
  19.     int index = 0;
  20.     while(*a++ != '\0' && *b++ != '\0')         //越过了第一个检查
  21.     {
  22.         if(*a != *b)        
  23.             break;
  24.         index++;
  25.     }
  26.     if(*a == '\0' && *b == '\0')
  27.         cout << "完全一致!";
  28.     else
  29.         cout << "不一样" << ' ' << index;
  30. }
复制代码


这是标准答案:
  1. #include <stdio.h>

  2. #define MAX 1024

  3. int main()
  4. {
  5.         char str1[MAX];
  6.         char str2[MAX];

  7.         char *target1 = str1;
  8.         char *target2 = str2;

  9.         int index = 1;

  10.         printf("请输入第一个字符串:");
  11.         fgets(str1, MAX, stdin);

  12.         printf("请输入第二个字符串:");
  13.         fgets(str2, MAX, stdin);

  14.         while (*target1 != '\0' && *target2 != '\0')
  15.         {
  16.                 if (*target1++ != *target2++)
  17.                 {
  18.                        break;
  19.                 }
  20.                 index++;
  21.         }

  22.         if (*target1 == '\0' && *target2 == '\0')
  23.         {
  24.                 printf("两个字符串完全一致!\n");
  25.         }
  26.         else
  27.         {
  28.                 printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
  29.         }

  30.         return 0;
  31. }
复制代码


最本质的区别是,我的21行while里面*a++ *b++的位置不一样,我的很明显有一个问题,就是越过了第一个字符的检查。但是我的运行结果很奇怪,当我输入abc abc两个相同的三位字符时,显示一致,但是,当我输入abcd abcd两个四位字符时,居然显示不同,并且index = 5。
问题就是:为什么我会得出这样的运行结果?
谢谢大家的帮助。



最佳答案
2017-12-12 09:25:12
因为你输入完一个字符串之后会用回车或者空格之类的结束,而fgets函数会将这个分隔符作为一个字符存到目标数组中,并在其之后加入'\0',这就是为什么你的index总是比实际输入的大1

从你的逻辑上来看,应该很难得到“完全一致”的输出结果,因为这个判断
    if(*a == '\0' && *b == '\0')
        cout << "完全一致!";
基本不太可能得到,当程序走到这里的时候,*a和*b已经不是指向'\0',而是它后面的那个字符

最后提醒:
将自增自减操作放在条件判断中是十分危险的事情!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-12 09:25:12 | 显示全部楼层    本楼为最佳答案   
因为你输入完一个字符串之后会用回车或者空格之类的结束,而fgets函数会将这个分隔符作为一个字符存到目标数组中,并在其之后加入'\0',这就是为什么你的index总是比实际输入的大1

从你的逻辑上来看,应该很难得到“完全一致”的输出结果,因为这个判断
    if(*a == '\0' && *b == '\0')
        cout << "完全一致!";
基本不太可能得到,当程序走到这里的时候,*a和*b已经不是指向'\0',而是它后面的那个字符

最后提醒:
将自增自减操作放在条件判断中是十分危险的事情!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-12 10:37:59 | 显示全部楼层
楼上正解,所以把a++ b++放while循环体内最保险
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <stdio.h>
  4. #include <string>
  5. #include <cstring>
  6. #define MAX 1024
  7. using namespace std;

  8. int main()
  9. {
  10.     char v1[MAX];
  11.     char v2[MAX];
  12.     char *a = v1;
  13.     char *b = v2;
  14.     cout << "字符串1:";
  15.     fgets(v1, MAX, stdin);
  16.     cout << "字符串2:";
  17.     fgets(v2, MAX, stdin);
  18.     char ch;
  19.     int index = 0;
  20.     while(*a != '\0' && *b != '\0')         //越过了第一个检查
  21.     {
  22.         if(*a != *b)        
  23.             break;

  24.                 //调试输出
  25.                 cout << *a << "\n";
  26.                 cout << *b << "\n";


  27.         index++;
  28.                 a++;
  29.                 b++;
  30.     }
  31.     if(*a == '\0' && *b == '\0')
  32.         cout << "完全一致!";
  33.     else
  34.         cout << "不一样" << ' ' << index;

  35.         return 0;
  36. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-12-14 15:38:12 | 显示全部楼层
诚如楼上所言,的确不太可能是完全一致,我用abc,abc得到了完全一致是个偶然,因为,第二次判断结束后,*a++这时还是在判断第三个位置,但是a与b都指向了下一个位置,都是'\n',的确也行,这时候while里面还是判断第四个位置,是\n不是\0,所以继续执行下去,*a == *b,都是\0,这时候返回while,是时候结束了,然而,只有a++了,b由于短路却没有,所以*b肯定是\0,但是*a指向了一个根本没初始化的地方,很恰巧,偶然是\0,于是就对了。
为了验证我的猜想,我把第一个数组,也就是*a指向的数组,初始化为a,而第二个数组不初始化,结果就不一致了。
秉承生物中控制变量的原则,我不初始化第一个数组,初始化第二个数组,果然还是输出一致。
获得的教训是:楼上说的,while里面不要自增自减,虽然大部分时候初始化都没什么用,但还是初始化一下吧。
最后,谢谢楼上二位的帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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