鱼C论坛

 找回密码
 立即注册
查看: 837|回复: 12

[已解决]带你学c带你飞 22课最后一题有没有啥问题没?

[复制链接]
发表于 2020-11-20 08:08:36 | 显示全部楼层 |阅读模式

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

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

x
#include <stdio.h>
#define MAX 1024

int main ()
{
        char str1[MAX];
        char str2[MAX];
       
        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;
}
最佳答案
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 的值判断就足够了。所以,后面的字符比较纯属多余。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-20 11:02:10 | 显示全部楼层

回帖奖励 +3 鱼币

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

楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的字符都已经比较过了,只剩下当前指针剩下的字符没有比较了,所以应该这样修改
if(ch >= n && *(strget1 + n) == *(strget2 + n))
改为
if(ch >= n && *strget1 == *strget2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-20 14:41:45 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-11-20 08:57
这一句

        改成下面这样就可以了

一会上完课回去试试 感谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-20 14:43:28 From FishC Mobile | 显示全部楼层
sunrise085 发表于 2020-11-20 11:02
楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的 ...

感谢解答 我是刚学指针  概念有点不清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-20 15:08:49 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-11-20 08:57
这一句

        改成下面这样就可以了

题目是要求打印第一处不相同的位置   如果在n处找到 或者在n处没找到  循环都会退出  所以下面比较了第n处的字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-20 15:12:15 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-11-20 15:23 编辑
sunrise085 发表于 2020-11-20 11:02
楼上指出了你的程序的问题所在,但是好像没改对。
for循环后两个指针都向后移动了,循环结束后,指针前的 ...


        根本没必要那么比,如果前 n 个字符相等,ch 一定等于 n,如果不想等,ch 一定小于 n。所以,只要根据 ch 的值判断就足够了。所以,后面的字符比较纯属多余。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
输出的是完全相同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 17:02:58 | 显示全部楼层
鱼币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 17:03:28 | 显示全部楼层
来鱼币啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-21 17:04:30 | 显示全部楼层

。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 17:05:44 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-21 17:06:30 | 显示全部楼层
啊啊,舒服
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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