天敌521 发表于 2020-11-20 08:08:36

带你学c带你飞 22课最后一题有没有啥问题没?

#include <stdio.h>
#define MAX 1024

int main ()
{
        char str1;
        char str2;
       
        char *strget1 = str1;
        char *strget2 = str2;
       
        int ch , n;
       
        printf("请输入第一串字符 ; ");
        fgets(str1, MAX, stdin);
       
        printf("请输入第二串字符 ; ");
        fgets(str2, MAX, stdin);
       
        printf("请输入需要对比的字符数 ; ");
        scanf("%d",&n);
       
        for(ch = 1; ch < n; ch++)
        {
                if(*strget1++ != *strget2++)
                {
                       break;
                }
        }
    if(ch >= n && *(strget1 + n) == *(strget2 + n))
    {
            printf("两个字符串的前 %d 个字符完全相同!",n);
        }
        else
        {
                printf("两个字符串不完全相同, 第 %d 个字符出现不同!\n",ch);
        }
       
        return 0;
}

jackz007 发表于 2020-11-20 08:57:04

      for(ch = 1; ch < n; ch++)
. . . . . .
                if(* strget1 ++ != * strget2 ++)         // 比较过程中,两个指针都在改变
. . . . . .

      if(ch >= n && *(strget1 + n) == *(strget2 + n))// 这里却要求两个指针必须在字符串开头位置

      这一句
                if(* strget1 ++ != * strget2 ++)
      改成下面这样就可以了
                if(* (strget1 + ch) != * (strget2 + ch))

sunrise085 发表于 2020-11-20 11:02:10

本帖最后由 sunrise085 于 2020-11-20 11:03 编辑

楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的字符都已经比较过了,只剩下当前指针剩下的字符没有比较了,所以应该这样修改
if(ch >= n && *(strget1 + n) == *(strget2 + n))
改为
if(ch >= n && *strget1 == *strget2)

天敌521 发表于 2020-11-20 14:41:45

jackz007 发表于 2020-11-20 08:57
这一句

      改成下面这样就可以了

一会上完课回去试试 感谢解答

天敌521 发表于 2020-11-20 14:43:28

sunrise085 发表于 2020-11-20 11:02
楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的 ...

感谢解答 我是刚学指针概念有点不清楚

天敌521 发表于 2020-11-20 15:08:49

jackz007 发表于 2020-11-20 08:57
这一句

      改成下面这样就可以了

题目是要求打印第一处不相同的位置   如果在n处找到 或者在n处没找到循环都会退出所以下面比较了第n处的字符

jackz007 发表于 2020-11-20 15:12:15

本帖最后由 jackz007 于 2020-11-20 15:23 编辑

sunrise085 发表于 2020-11-20 11:02
楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的 ...

      根本没必要那么比,如果前 n 个字符相等,ch 一定等于 n,如果不想等,ch 一定小于 n。所以,只要根据 ch 的值判断就足够了。所以,后面的字符比较纯属多余。

天敌521 发表于 2020-11-20 18:40:43

jackz007 发表于 2020-11-20 15:12
根本没必要那么比,如果前 n 个字符相等,ch 一定等于 n,如果不想等,ch 一定小于 n。所以, ...

比如 12345 和12346
我输入前5个
      for(ch = 1; ch < n; ch++)
      {
                if(*strget1++ != *strget2++)
                {
                         break;
                }
此时循环退出 ch返回值为5
5 >= n
输出的是完全相同

象棋爱好者 发表于 2020-11-21 17:02:58

鱼币

象棋爱好者 发表于 2020-11-21 17:03:28

来鱼币啊

象棋爱好者 发表于 2020-11-21 17:04:30


。。。。。

象棋爱好者 发表于 2020-11-21 17:05:44

{:10_266:}{:10_266:}{:10_266:}

象棋爱好者 发表于 2020-11-21 17:06:30

啊啊,舒服
页: [1]
查看完整版本: 带你学c带你飞 22课最后一题有没有啥问题没?