S1E22的动动手第0题有疑惑,求大佬解惑
if((int)ch < 0)里面为什么是target += 2?原题:https://fishc.com.cn/forum.php?mod=viewthread&tid=72205&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570
获取字符串的长度 —— strlen 函数,进阶要求:你可能发现写出来的代码只能统计英文字符的个数,遇到中文字符结果就会出错。请自行观察你当前系统对中文字符的处理方式,并设计一个可以统计中文字符以及中英文混合字符的程序。
#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;
} 对
char str[]="中";
你这样声明一个数组来存放中文字符 自带NUL呀2+1 ==3
target += 2 是因为这个代码认为 一个中文字符是 3 个字节
因为前面已经 ch = *target++;
这里再加 2,一共是 3 个字节
人造人 发表于 2021-8-17 14:00
target += 2 是因为这个代码认为 一个中文字符是 3 个字节
因为前面已经 ch = *target++;
这里再加 2,一 ...
在小鱼的编译里面,他的中文是四个字符的
原话:先用以下代码做个实验:
#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;
}
不难发现,每个中文字符在我们的系统中是占用 4 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。
人造人 发表于 2021-8-17 14:00
target += 2 是因为这个代码认为 一个中文字符是 3 个字节
因为前面已经 ch = *target++;
这里再加 2,一 ...
虽然我的编译器也是三个,但是用+2,编译结果是错的,用+1才是对的 wxm23333 发表于 2021-8-17 14:13
虽然我的编译器也是三个,但是用+2,编译结果是错的,用+1才是对的
那不就说明你的系统占两个字节吗 万千只cnm 发表于 2021-8-17 14:19
那不就说明你的系统占两个字节吗
这里显示的3 wxm23333 发表于 2021-8-17 14:22
这里显示的3
因为还有\0 呀 万千只cnm 发表于 2021-8-17 14:24
因为还有\0 呀
有\0不就退出循环了吗 万千只cnm 发表于 2021-8-17 14:24
因为还有\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;
} wxm23333 发表于 2021-8-17 14:25
我的意思是你中文占两个字节加上\0 所以才三个
所以target ++ 就行了
你+2可能越界了并不会停止 万千只cnm 发表于 2021-8-17 14:30
我的意思是你中文占两个字节加上\0 所以才三个
所以target ++ 就行了
意思是其实在这串字里面,实际上汉字只占2个字节,但测试时因为只有一个汉字,所以是两个字节加上一个结束符'\0'
是这样吗? 万千只cnm 发表于 2021-8-17 14:38
对
你这样声明一个数组来存放中文字符 自带NUL呀2+1 ==3
懂了,感谢 wxm23333 发表于 2021-8-17 14:41
懂了,感谢
https://fishc.com.cn/thread-200275-1-1.html
能帮忙评个分嘛{:5_92:} 我写的帖子
页:
[1]