xieyuwen 发表于 2022-1-7 08:44:15

S1E22作业比较字符串

#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++ || *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;
}

xieyuwen 发表于 2022-1-7 08:46:22

第一个中文是相同的,为什么会说第一个中文不相同呢

大马强 发表于 2022-1-7 09:24:13

你比较的是下一个字符,所以跳出的时候下标应该也要往前进一位
#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++ || *target1++ != *target2++)
                        {
                              break;
                        }
                }
                if (*target1++ != *target2++) // 你这是比较了下一个字符,所以index要加一
                {
                           index++;
                     break;
                }
                index++;
                n--;
      }

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

      return 0;
}

阿萨德按时 发表于 2022-1-7 09:29:54

{:10_282:}为什么我复制楼主的程序运行出来是正确的

阿萨德按时 发表于 2022-1-7 09:33:39

大马强 发表于 2022-1-7 09:24
你比较的是下一个字符,所以跳出的时候下标应该也要往前进一位

为什么中文是正确的数字和字母不行。。

大马强 发表于 2022-1-7 09:43:25

又改了一遍,因为scanf输入的中止符是 \n,所以niwhiel的判断要改一改
#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;

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

      char ch;
      int index = 0, n;

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

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

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

      while (n && *target1 != '\n' && *target2 != '\n')// scanf的字符串中止符是 \n
      {
                ch = *target1;
                if (ch < 0)
                {
                        if (*target1++ != *target2++ || *target1++ != *target2++)
                        {
                              break;
                        }
                }
                if (*target1++ != *target2++) // 你这是比较了下一个字符,所以index要加一
                {
                           index++;
                     break;
                }
                index++;
                n--;
      }

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

      return 0;
}

大马强 发表于 2022-1-7 09:46:09

阿萨德按时 发表于 2022-1-7 09:33
为什么中文是正确的数字和字母不行。。

因为他是1开始,把index = 0 就好了

阿萨德按时 发表于 2022-1-7 09:53:40

大马强 发表于 2022-1-7 09:43
又改了一遍,因为scanf输入的中止符是 \n,所以niwhiel的判断要改一改

这次是英文可以中文不行了。。。。

xieyuwen 发表于 2022-1-7 11:08:15

好奇怪呀,中文可以,英文又不可以了

大马强 发表于 2022-1-7 11:08:29

阿萨德按时 发表于 2022-1-7 09:53
这次是英文可以中文不行了。。。。

这个应该可以了
但是我还没解决不等长问题,比如 edd e 比较3个
#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;

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

      char ch;
      int index = 0, n;

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

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

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

      while (n && *target1 != '\n' && *target2 != '\n')// fgets的字符串中止符是 \n
      {
                ch = *target1;
                if (ch < 0) //判断是否位中文
                {
                        if (*target1++ != *target2++ || *target1++ != *target2++)
                        {
                                        index++;
                              break;
                        }
                }
                else if (*target1++ != *target2++) // 你这是比较了下一个字符,所以index要加一
                {
                     index++;
                     break;
                }

                                index++;
                n--;

      }

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

      return 0;
}

xieyuwen 发表于 2022-1-7 11:09:03

哭了

大马强 发表于 2022-1-7 11:28:21

xieyuwen 发表于 2022-1-7 11:09
哭了

解决了{:10_297:}
#include <stdio.h>

#define MAX 1024

int main()
{
      char str1;
      char str2;

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

      char ch;
      int index = 0, n;

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

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

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

      while (n && *target1 != '\n' && *target2 != '\n')// fgets的字符串中止符是 \n
      {
                ch = *target1;
                if (ch < 0) //判断是否位中文
                {
                        if (*target1++ != *target2++ || *target1++ != *target2++)
                        {
                                        index++;
                              break;
                        }
                }
                else if (*target1++ != *target2++) // 你这是比较了下一个字符,所以index要加一
                {
                     index++;
                     break;
                }

                                index++;
                n--;

      }

      if (n == 0)
      {
                printf("两个字符串的前 %d 个字符完全相同!\n", index);
      }
      else
      {                       
                      if (*target1 != *target2 && (*target1 == '\n' || *target2 == '\n')) // 说明 两者不相等,并且其中一个长于另一个
                        printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index+1);
                else
                        printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
      }

      return 0;
}

xieyuwen 发表于 2022-1-7 18:35:58

谢谢老铁了
页: [1]
查看完整版本: S1E22作业比较字符串