c语言课后作业22,指针与数组
本帖最后由 大学里的小菜鸡 于 2020-8-22 20:14 编辑#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 个字节的存储空间,并且都是负数。以此规律,我们只要检测一个字符对应的整型值是否为负数,如果是(中文字符),则将指针往后移动两个字节。
请问不是占用四个字节吗,为什么是后移两个字节,为什么不是移动其它个数的字节,我电脑运行这代码显示的是3,那该移动多少字节
运行小甲鱼的代码我这显示的不符合啊 本帖最后由 sunrise085 于 2020-8-22 20:13 编辑
你理解的不对,一个汉字占三个字节,另外一个是字符串的结束字符'\0'
你可以多输入几个汉字,就知道一个汉字是三个字节了
#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;
}
运行结果
length of str: 7
str = -28
str = -72
str = -83
str = -27
str = -101
str = -67
str = 0 sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。
利用sizeof()计算数组的长度
数组的长度 = 数组所占的大小/单个数组元素所占的大小
运行结果也证明这一点,单个中文字符的长度是2,两个中文字符的长度是4,四个中文字符的长度是8。下图分另显示的是3,5,9,这是因为用sizeof计算字符长度,包括字符串结尾的'\0',用strlen返回的是该字符串的长度,包括字符串结尾的'\0'。
sunrise085 发表于 2020-8-22 20:12
你理解的不对,一个汉字占三个字节,另外一个是字符串的结束字符'\0'
你可以多输入几个汉字,就知道一个汉 ...
length = sizeof(str) / sizeof(str);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减呢 风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。
利用sizeof()计算数组的长度
strlen返回的值不是应该比sizeof的值小一吗,strlen没有计算最后的\0;我记得小甲鱼说sizeof计算的是尺寸,strlen计算的是长度 大学里的小菜鸡 发表于 2020-8-22 20:54
length = sizeof(str) / sizeof(str);
这行代码就是为了活动字节长度吗?如果是的话为什么是除不是减 ...
这个代码是为了获得字符串数组的字符数,用字符串的字节数除以一个单元的字节数
用char看不出来什么效果,若用其他类型就看出效果了
#include<stdio.h>
int main()
{
int str[] = {12,2,5};
printf("数组的字节数:%lu,一个单元的字节数:%lu\n",sizeof(str),sizeof(str));
printf("数组的长度:%lu\n",sizeof(str)/sizeof(str));
return 0;
}
风过无痕1989 发表于 2020-8-22 20:49
sizeof是运算操作符,得到的结果类型为size_t,即unsigned int类型。
利用sizeof()计算数组的长度
你这个是编码不同。
和楼主用的不是同样的编译器 sunrise085 发表于 2020-8-22 21:07
你这个是编码不同。
和楼主用的不是同样的编译器
是,我用的是VC++6.0 修改了一下程序:
#include <stdio.h>
int main()
{
char str[] = "中国人民";
int length, i;
length = sizeof(str) / sizeof(str);
printf("length of str: %d\n", length - 1); // 长度减 1,去掉结尾标志
for (i = 0; i < length - 1; i++)
{
printf("str[%d] = %d\n", i, str);// str 输出的是地址,改为 str
}
return 0;
}
本帖最后由 大学里的小菜鸡 于 2020-8-24 12:31 编辑
sunrise085 发表于 2020-8-22 21:05
这个代码是为了获得字符串数组的字符数,用字符串的字节数除以一个单元的字节数
用char看不出来什么效果 ...
你好,请教一个virtualbox安装过程中在安装图形界面过程中的切换普通用户输入reboot,却没有重启,而是显示need to be root,请问这是需要切换到root超级权限后再输入reboot吗,现在解决了,打扰了 大学里的小菜鸡 发表于 2020-8-24 12:25
你好,请教一个virtualbox安装过程中在安装图形界面过程中的切换普通用户输入reboot,却没有重启,而是 ...
你选的 这个最佳答案是解决你的问题的吗?
用的编译器都不一样,编码方式也不同。
为啥我这么认真的解答问题,都不换不来一个最佳答案呢。。。 sunrise085 发表于 2020-8-24 17:55
你选的 这个最佳答案是解决你的问题的吗?
用的编译器都不一样,编码方式也不同。
为啥我这么认真的解 ...
不是,您的回答对我的帮助很大,很感谢,但是我本人比较喜欢图片点,感觉这样形象一点,很抱歉,但是您的回答对我的确有很大的帮助 大学里的小菜鸡 发表于 2020-8-24 18:06
不是,您的回答对我的帮助很大,很感谢,但是我本人比较喜欢图片点,感觉这样形象一点,很抱歉,但是您的 ...
论坛的评选最佳答案的机制。
第一、帮助提问者解答问题;
第二、帮助后面遇到同样问题的人快速找解决方法;
第三、给解答问题者奖励。
你这因为你个人喜好,就不顾回答问题者的利益了? sunrise085 发表于 2020-8-24 18:38
论坛的评选最佳答案的机制。
第一、帮助提问者解答问题;
第二、帮助后面遇到同样问题的人快速找解决方 ...
现在知道规则了,下次一定改正
页:
[1]