马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码1:#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 ([b]*target1++ != *target2++[/b] || [b]*target1++ != *target2++[/b])
{
break;
}
}
if ([b]*target1++ != *target2++[/b])
{
break;
}
index++;
n--;
}
if ((n == 0) || (*target1 == '\0' && *target2 == '\0'))
{
printf("两个字符串的前 %d 个字符完全相同!\n", index);
}
else
{
printf("两个字符串不完全相同,第 %d 个字符出现不同!\n", index);
}
return 0;
}
代码2:#include <stdio.h>
#define MAX 1024
int main()
{
char str1[MAX];
char str2[MAX];
char *target1 = str1;
char *target2 = str2;
char ch;
int n;
printf("请输入一个字符串到 str1 中:");
fgets(str1, MAX, stdin);
printf("请输入需要拷贝的字符个数:");
scanf("%d", &n);
printf("开始拷贝 str1 的内容到 str2 中...\n");
while (n--)
{
ch = *target2++ = *target1++;
if (ch == '\0')
{
break;
}
if ((int)ch < 0)
{
[b]*target2++ = *target1++[/b];
[b]*target2++ = *target1++[/b];
}
}
*target2 = '\0';
printf("拷贝完毕!\n");
printf("现在,str2 中的内容是:%s\n", str2);
return 0;
}
问题:这些加粗的地方为什么要重复编写?有什么意义在这?
这些加粗的地方是为了处理字符串中的中文字符。在C语言中,一个中文字符占用两个字节,而一个英文字符只占用一个字节。因此,当我们遇到一个中文字符时,需要连续读取两个字节,并将其拷贝到目标字符串中。
在代码1中,当遇到一个中文字符时,我们需要重复编写 *target1++ != *target2++ 两次,分别读取两个字节,并将其拷贝到目标字符串中。
在代码2中,当遇到一个中文字符时,我们需要重复编写 *target2++ = *target1++ 两次,分别读取两个字节,并将其拷贝到目标字符串中。
这样做的意义在于确保正确处理中文字符,以保证字符串的比较和拷贝的准确性。
|