水边的小姑娘 发表于 2022-9-6 09:34:47

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

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

人造人 发表于 2022-9-6 15:00:00

这个程序假设一个中文字符是3个字节
在你看来程序应该改成什么样?改出来,贴上来
我给你找问题

水边的小姑娘 发表于 2022-9-6 18:43:30

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

#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;

      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;
}
这个样子,不同之处就是画红圈的地方不用或运算

人造人 发表于 2022-9-6 19:02:29

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

#define MAX 1024

int main()
{
      char str1;
      char str2;

      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;
}
$ gcc-debug -o main main.c
$ ./main
请输入第一个字符串:带你学C带你飞-hello
请输入第二个字符串:带你学C带你飞-world
请输入需要对比的字符个数:99
两个字符串不完全相同,第 11 个字符出现不同!
$


是第11个吗?你数一数,是第9个吧

水边的小姑娘 发表于 2022-9-6 19:14:21

人造人 发表于 2022-9-6 19:02
是第11个吗?你数一数,是第9个吧

不好意思QWQ不小心点到反对了
我这里显示的是第9个开始不同

人造人 发表于 2022-9-6 19:15:28

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

是的,因为你的这个程序是假设一个中文字符是2个字节

水边的小姑娘 发表于 2022-9-6 19:16:44

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

@_@

人造人 发表于 2022-9-6 19:17:36

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

在你那边,1个中文字符是2个字节
我这边的1个中文字符是3个字节
你那边的结果是9,我这边是11

水边的小姑娘 发表于 2022-9-6 19:18:54

人造人 发表于 2022-9-6 19:15
是的,因为你的这个程序是假设一个中文字符是2个字节

soga
但是我认为就算假定一个中文字符是3字节,单单进行*target1++ != *target2++多次也能达到*target1++ != *target2++ || *target1++ != *target2++想要实现的效果

人造人 发表于 2022-9-6 19:21:45

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

是的,再加一个就好了

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

#define MAX 1024

int main()
{
      char str1;
      char str2;

      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;
                        }
                }
                if (*target1++ != *target2++)
                {
                     break;
                }
                index++;
                n--;
      }

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

      return 0;
}
$ gcc-debug -o main main.c
$ ./main
请输入第一个字符串:带你学C带你飞-hello
请输入第二个字符串:带你学C带你飞-world
请输入需要对比的字符个数:99
两个字符串不完全相同,第 9 个字符出现不同!
$

水边的小姑娘 发表于 2022-9-6 19:25:15

人造人 发表于 2022-9-6 19:21
是的,再加一个就好了

{:9_219:}但是既然break的条件相同if (*target1++ != *target2++)
{
      break;
}
用一个if跟用两个不是一样的嘛QAQ

人造人 发表于 2022-9-6 19:29:39

水边的小姑娘 发表于 2022-9-6 19:25
但是既然break的条件相同
用一个if跟用两个不是一样的嘛QAQ

不一样,用一个加一次,用两个加两次
要不就加一个for循环
      while (n && *target1 != '\0' && *target2 != '\0')
      {
                ch = *target1;
                if (ch < 0)
                {
                        for(size_t i = 0; i < 2; ++i)
                        {
                              if (*target1++ != *target2++)
                              {
                                        break;
                              }
                        }
                }
                if (*target1++ != *target2++)
                {
                     break;
                }
                index++;
                n--;
      }

水边的小姑娘 发表于 2022-9-6 19:47:23

人造人 发表于 2022-9-6 19:29
不一样,用一个加一次,用两个加两次
要不就加一个for循环

这一点我已经明白了,万分感谢!!!{:7_123:}
页: [1]
查看完整版本: 《带你学C带你飞》指针和数组课后作业的一个疑惑