鱼C论坛

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

[已解决]《带你学C带你飞》指针和数组课后作业的一个疑惑

[复制链接]
发表于 2022-9-6 09:34:47 | 显示全部楼层 |阅读模式

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

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

x
https://fishc.com.cn/thread-72205-1-1.html
最后块代码里用到了或运算,我觉得这里应该用与运算或者直接写成
if (*target1++ != *target2++)
两种运算都不用:
使用或运算如果在第一次两个数值不相等时还要看后一位置两个数值想不想等,这没必要,不如直接 if (*target1++ != *target2++)
而使用与运算第一次两数值相等还要看后裔位置两数值是否相等,同时两个指针都向后移动了两个位置,这才符合小甲鱼的思路
最佳答案
2022-9-6 19:02:29
  1. $ cat main.c
  2. #include <stdio.h>

  3. #define MAX 1024

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

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

  10.         char ch;
  11.         int index = 1, n;

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

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

  16.         printf("请输入需要对比的字符个数:");
  17.         scanf("%d", &n);

  18.         while (n && *target1 != '\0' && *target2 != '\0')
  19.         {
  20.                 ch = *target1;
  21.                 if (ch < 0)
  22.                 {
  23.                         if (*target1++ != *target2++)
  24.                         {
  25.                                 break;
  26.                         }
  27.                 }
  28.                 if (*target1++ != *target2++)
  29.                 {
  30.                        break;
  31.                 }
  32.                 index++;
  33.                 n--;
  34.         }

  35.         if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
  36.         {
  37.                 printf("两个字符串的前 %d 个字符完全相同!\n", index);
  38.         }
  39.         else
  40.         {
  41.                 printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
  42.         }

  43.         return 0;
  44. }
  45. $ gcc-debug -o main main.c
  46. $ ./main
  47. 请输入第一个字符串:带你学C带你飞-hello
  48. 请输入第二个字符串:带你学C带你飞-world
  49. 请输入需要对比的字符个数:99
  50. 两个字符串不完全相同,第 11 个字符出现不同!
  51. $
复制代码


是第11个吗?你数一数,是第9个吧
^_^~.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-6 15:00:00 | 显示全部楼层
这个程序假设一个中文字符是3个字节
在你看来程序应该改成什么样?改出来,贴上来
我给你找问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 18:43:30 | 显示全部楼层
人造人 发表于 2022-9-6 15:00
这个程序假设一个中文字符是3个字节
在你看来程序应该改成什么样?改出来,贴上来
我给你找问题

#include <stdio.h>

#define MAX 1024

int main()
{
        char str1[MAX];
        char str2[MAX];

        char *target1 = str1;
        char *target2 = str2;

        char ch;
        int index = 1, n;

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

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

        printf("请输入需要对比的字符个数:");
        scanf("%d", &n);

        while (n && *target1 != '\0' && *target2 != '\0')
        {
                ch = *target1;
                if (ch < 0)
                {
                        if (*target1++ != *target2++)
                        {
                                break;
                        }
                }
                if (*target1++ != *target2++)
                {
                       break;
                }
                index++;
                n--;
        }

        if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
        {
                printf("两个字符串的前 %d 个字符完全相同!\n", index);
        }
        else
        {
                printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
        }

        return 0;
}
这个样子,不同之处就是画红圈的地方不用或运算
^_^.png
;).png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 19:02:29 | 显示全部楼层    本楼为最佳答案   
  1. $ cat main.c
  2. #include <stdio.h>

  3. #define MAX 1024

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

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

  10.         char ch;
  11.         int index = 1, n;

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

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

  16.         printf("请输入需要对比的字符个数:");
  17.         scanf("%d", &n);

  18.         while (n && *target1 != '\0' && *target2 != '\0')
  19.         {
  20.                 ch = *target1;
  21.                 if (ch < 0)
  22.                 {
  23.                         if (*target1++ != *target2++)
  24.                         {
  25.                                 break;
  26.                         }
  27.                 }
  28.                 if (*target1++ != *target2++)
  29.                 {
  30.                        break;
  31.                 }
  32.                 index++;
  33.                 n--;
  34.         }

  35.         if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
  36.         {
  37.                 printf("两个字符串的前 %d 个字符完全相同!\n", index);
  38.         }
  39.         else
  40.         {
  41.                 printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
  42.         }

  43.         return 0;
  44. }
  45. $ gcc-debug -o main main.c
  46. $ ./main
  47. 请输入第一个字符串:带你学C带你飞-hello
  48. 请输入第二个字符串:带你学C带你飞-world
  49. 请输入需要对比的字符个数:99
  50. 两个字符串不完全相同,第 11 个字符出现不同!
  51. $
复制代码


是第11个吗?你数一数,是第9个吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2022-9-6 19:14:21 | 显示全部楼层
人造人 发表于 2022-9-6 19:02
是第11个吗?你数一数,是第9个吧

不好意思QWQ不小心点到反对了
我这里显示的是第9个开始不同
;)~.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 19:15:28 | 显示全部楼层
水边的小姑娘 发表于 2022-9-6 19:14
不好意思QWQ不小心点到反对了
我这里显示的是第9个开始不同

是的,因为你的这个程序是假设一个中文字符是2个字节
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-9-6 19:16:44 | 显示全部楼层
水边的小姑娘 发表于 2022-9-6 19:14
不好意思QWQ不小心点到反对了
我这里显示的是第9个开始不同

@_@
^_^~.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 19:17:36 | 显示全部楼层
水边的小姑娘 发表于 2022-9-6 19:14
不好意思QWQ不小心点到反对了
我这里显示的是第9个开始不同

在你那边,1个中文字符是2个字节
我这边的1个中文字符是3个字节
你那边的结果是9,我这边是11
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 19:18:54 | 显示全部楼层
人造人 发表于 2022-9-6 19:15
是的,因为你的这个程序是假设一个中文字符是2个字节

soga
但是我认为就算假定一个中文字符是3字节,单单进行*target1++ != *target2++多次也能达到*target1++ != *target2++ || *target1++ != *target2++想要实现的效果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 19:21:45 | 显示全部楼层
水边的小姑娘 发表于 2022-9-6 19:18
soga
但是我认为就算假定一个中文字符是3字节,单单进行*target1++ != *target2++多次也能达到*target1+ ...

是的,再加一个就好了

  1. $ cat main.c
  2. #include <stdio.h>

  3. #define MAX 1024

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

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

  10.         char ch;
  11.         int index = 1, n;

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

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

  16.         printf("请输入需要对比的字符个数:");
  17.         scanf("%d", &n);

  18.         while (n && *target1 != '\0' && *target2 != '\0')
  19.         {
  20.                 ch = *target1;
  21.                 if (ch < 0)
  22.                 {
  23.                         if (*target1++ != *target2++)
  24.                         {
  25.                                 break;
  26.                         }
  27.                         if (*target1++ != *target2++)
  28.                         {
  29.                                 break;
  30.                         }
  31.                 }
  32.                 if (*target1++ != *target2++)
  33.                 {
  34.                        break;
  35.                 }
  36.                 index++;
  37.                 n--;
  38.         }

  39.         if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
  40.         {
  41.                 printf("两个字符串的前 %d 个字符完全相同!\n", index);
  42.         }
  43.         else
  44.         {
  45.                 printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
  46.         }

  47.         return 0;
  48. }
  49. $ gcc-debug -o main main.c
  50. $ ./main
  51. 请输入第一个字符串:带你学C带你飞-hello
  52. 请输入第二个字符串:带你学C带你飞-world
  53. 请输入需要对比的字符个数:99
  54. 两个字符串不完全相同,第 9 个字符出现不同!
  55. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-9-6 19:25:15 | 显示全部楼层
人造人 发表于 2022-9-6 19:21
是的,再加一个就好了

但是既然break的条件相同
  1. if (*target1++ != *target2++)
  2. {
  3.         break;
  4. }
复制代码

用一个if跟用两个不是一样的嘛QAQ
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-6 19:29:39 | 显示全部楼层
水边的小姑娘 发表于 2022-9-6 19:25
但是既然break的条件相同
用一个if跟用两个不是一样的嘛QAQ

不一样,用一个加一次,用两个加两次
要不就加一个for循环
  1.         while (n && *target1 != '\0' && *target2 != '\0')
  2.         {
  3.                 ch = *target1;
  4.                 if (ch < 0)
  5.                 {
  6.                         for(size_t i = 0; i < 2; ++i)
  7.                         {
  8.                                 if (*target1++ != *target2++)
  9.                                 {
  10.                                         break;
  11.                                 }
  12.                         }
  13.                 }
  14.                 if (*target1++ != *target2++)
  15.                 {
  16.                        break;
  17.                 }
  18.                 index++;
  19.                 n--;
  20.         }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-9-6 19:47:23 | 显示全部楼层
人造人 发表于 2022-9-6 19:29
不一样,用一个加一次,用两个加两次
要不就加一个for循环

这一点我已经明白了,万分感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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