关于字符长度的诡异现象(已解决)
时间:2010-09-12
来源:互联网
本帖最后由 blackgenius 于 2010-09-12 13:48 编辑
我写了这么一段代码,测试字符串和字符数组的长度问题,测试strlen和sizeof函数的异同,结果有一处很不明白,先看程序
复制代码
这个程序运行的结果如下:
首先,语句For the array: 之后跟的打印结果,结尾出现乱码是和原因?
其次,在array情况下,sizeof的值为什么会是4?<在pointer情况下sizeof的值为4是因为字符串只能用strlen去求长度,sizeof得到的会是指针本身的值的长度(long型)>
最后,为什么函数形参设为char str[5]型,对于字符数组,传参到函数之后,打印其sizeof的值时得到的是4?
高手指点迷津,小生谢过~
发现我太幼稚了,仔细查了一下,当我的函数用数组做形参时,等价于传递了数组的首地址给函数,意味着在函数中使用sizeof函数求得的都是等价于对字符串指针求sizeof,得到的是地址所占的空间大小,也就是一个long型的数据sizeof的大小。T T只笑自己太幼稚啊~哈哈!不过还请指点,Array情况下输出为什么出现了乱码?
我写了这么一段代码,测试字符串和字符数组的长度问题,测试strlen和sizeof函数的异同,结果有一处很不明白,先看程序
- #include <stdio.h>
- #include <string.h>
-
- int
- main()
- {
- char str[5] = “12345”;
- char *pstr;
- int i;
-
- void test(char str[5]);
-
- pstr = "12345";
- printf("In the main func\n");
- for (i=0; i<5; i++)
- printf("%c\n", str[i]);
- printf("%s\n", pstr);
- printf("sizeof(str[]): %d\n", sizeof(str));
- printf("strlen(pstr): %d\n", strlen(pstr));
- printf("For the array:\n");
- test(str);
- printf("For the pointer:\n");
- test(pstr);
- return 0;
- }
-
- void test(char str[5]) {
- int s;
- s = sizeof(str);
- printf("%s\n", str);
- printf("The value of sizeof func: %d\n", s);
- }

首先,语句For the array: 之后跟的打印结果,结尾出现乱码是和原因?
其次,在array情况下,sizeof的值为什么会是4?<在pointer情况下sizeof的值为4是因为字符串只能用strlen去求长度,sizeof得到的会是指针本身的值的长度(long型)>
最后,为什么函数形参设为char str[5]型,对于字符数组,传参到函数之后,打印其sizeof的值时得到的是4?
高手指点迷津,小生谢过~
发现我太幼稚了,仔细查了一下,当我的函数用数组做形参时,等价于传递了数组的首地址给函数,意味着在函数中使用sizeof函数求得的都是等价于对字符串指针求sizeof,得到的是地址所占的空间大小,也就是一个long型的数据sizeof的大小。T T只笑自己太幼稚啊~哈哈!不过还请指点,Array情况下输出为什么出现了乱码?
作者: blackgenius 发布时间: 2010-09-12
sprintf不是那么用吧,
sprintf(char *str, const char *format,...)
sprintf(char *str, const char *format,...)
作者: kingoftime3 发布时间: 2010-09-12
第一个问题,因为把12345装在str[5]里表示的不是一个合法的字符,后面应该还有一位'\0'
第二个问题,当数组当作函数参数时它就是一个指针
第二个问题,当数组当作函数参数时它就是一个指针
作者: kingoftime3 发布时间: 2010-09-12
回复 kingoftime3
跟那个没有关系
跟那个没有关系
作者: blackgenius 发布时间: 2010-09-12
回复 kingoftime3
我也考虑是这一点,作为字符数组,是不需要'\0'的,只是作为字符串的时候才需要'\0'。这样考虑应该是对的,因为没有'\0'所以导致当传到函数中以%s输出时它不是一个合法的字符串,除了12345这五位之外,还把后面的内容输出了~我们考虑的应该是一样的,还是谢谢你~
我也考虑是这一点,作为字符数组,是不需要'\0'的,只是作为字符串的时候才需要'\0'。这样考虑应该是对的,因为没有'\0'所以导致当传到函数中以%s输出时它不是一个合法的字符串,除了12345这五位之外,还把后面的内容输出了~我们考虑的应该是一样的,还是谢谢你~
作者: blackgenius 发布时间: 2010-09-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28