鱼C论坛

 找回密码
 立即注册
查看: 1058|回复: 3

C语言问题,有鱼币赏

[复制链接]
发表于 2023-10-11 21:57:55 | 显示全部楼层 |阅读模式

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

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

x
#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++ || *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;
}
中的这部分
  if (ch < 0)
                {
                        if (*target1++ != *target2++ || *target1++ != *target2++)
                        {
                                break;
                        }
                }
里面的这个语句咋理解,为啥这么打?
  if (*target1++ != *target2++ || *target1++ != *target2++)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-11 21:58:20 | 显示全部楼层
这段代码的功能是比较两个字符串前n个字符是否相同。当一个字符为负数时,会判断后面两个字符是否一起构成一个汉字,即检查是否是UTF-8编码。和ASCII编码不同,UTF-8中一个汉字由多个字节组成,第一个字节以110开始,后面的字节均以10开始。

所以if (ch < 0)就是判断当前字符是否是一个汉字的首字节。如果是,就用 *target1++ != *target2++ || *target1++ != *target2++ 检查后面两个字符是否完全相等,因为一个汉字有两个及以上的字节,需要一起比较。

其中 *target1++ != *target2++ || *target1++ != *target2++ 表示如果后面两个字符不完全相等,就跳出while循环,退出比较过程。

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 21:58:21 | 显示全部楼层
这段代码的作用是比较两个字符串的前n个字符是否相同,如果相同则输出相同的字符数量,如果不同则输出第一个不同字符的位置。



在这个if语句中,当ch小于0时,说明当前字符是中文字符,因为中文字符占用两个字节,所以需要比较两次。如果两个字符不相等,则跳出循环,否则继续比较下一个字符。



而在if语句中的 *target1++ != *target2++ || *target1++ != *target2++ 则是先比较target1和target2指向的字符是否相等,如果不相等则跳出循环。如果相等,则继续比较下一个字符,这里使用了逻辑或运算符,只要其中一个条件满足就会跳出循环。同时,由于使用了后缀自增运算符,所以每次比较的是target1和target2指向的字符,然后再将指针向后移动一个位置。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-11 21:58:26 | 显示全部楼层
这段代码是在比较两个字符串的前n个字符是否相同。这个特定的部分,if (ch < 0),是在处理可能的多字节字符,这在某些字符编码(如UTF-8)中是常见的。

if (*target1++ != *target2++ || *target1++ != *target2++)这行代码的含义是,如果target1target2指向的当前字符不相同,或者它们指向的下一个字符不相同,那么就跳出循环。这里的*target1++*target2++是先取指针指向的字符值,然后将指针向后移动一位。

然而,这段代码可能存在问题。在if (ch < 0)的条件下,*target1++ != *target2++*target1++ != *target2++会连续执行两次,这意味着指针会移动两次,而不是预期的一次。这可能会导致跳过一些字符,或者在字符串结束后读取内存,这可能会导致未定义的行为。

如果你的目标是比较两个可能包含多字节字符的字符串的前n个字符,你可能需要使用更复杂的方法,例如使用专门处理多字节字符的函数,或者使用支持多字节字符的库。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-3 22:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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