指针移动字节
本帖最后由 小亦003 于 2021-12-6 12:12 编辑下面代码中的解释中为什么是中文字符时指针要向后移动两个字节???
#include <stdio.h>
int main()
{
char str[] = "中";
int length, i;
length = sizeof(str) / sizeof(str);
printf("length of str: %d\n", length);
for (i = 0; i < length; i++)
{
printf("str[%d] = %d\n", i, str);
}
return 0;
}
#include <stdio.h>
#define MAX 1024
int main()
{
char str;
char *target = str;
char ch;
int length = 0;
printf("请输入一个字符串:");
fgets(str, MAX, stdin);
while (1)
{
ch = *target++;
if (ch == '\0')
{
break;
}
if ((int)ch < 0)
{
target += 2;
}
length++;
}
printf("您总共输入了 %d 个字符!\n", length - 1);
return 0;
} 本帖最后由 小亦003 于 2021-12-6 12:02 编辑
为什么是移动2个字节? 本帖最后由 jackz007 于 2021-12-6 13:02 编辑
ch = * target ++ ; // 赋值的时候 target = target + 1
. . . . . .
if ((int)ch < 0)
{
target += 2 ; // 当 ch 属于汉字字符时,target = target + 2
所以,当 ch 属于中文字符时,target 指针总共前进的是 3 个字节,而 ch 是英文字符时,target 指针只前进 1 个字节。
这个代码只适合在 Linux 系统下,因为 Linux 系统采用 'UTF-8' 编码,每个汉字占用了 3 个字节,如果是在 Windows 下,中文版 Windows 采用的是 'GB2312' 编码,每个汉字占用的是 2 个字节,在 Windows 下你的代码必须修改
if ((int)ch < 0)
{
target ++ ;// 这里要修改
}
否则,统计出来的结果肯定是错误的。 jackz007 发表于 2021-12-6 12:57
所以,当 ch 属于中文字符时,target 指针总共前进的是 3 个字节,而 ch 是英文字符时,target...
感谢大佬
页:
[1]