鱼C论坛

 找回密码
 立即注册
查看: 1969|回复: 7

[已解决]sizeof和strlen

[复制链接]
发表于 2016-1-17 11:15:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我在虚拟机里的ubuntu下跑以下程序
#include <stdio.h>
#include <string.h>

int main()
{
    unsigned char *name = "fishc\0";
    ussinged char d = {'f', 'i', 's', 'h', 'c', '\0'};
    printf("length of name is %d\n", strlen(name);
    printf("length of d is %d\n", strlen(d);
    return 0;
}

运行后,显示的结果都是一样的长度,都是5。

如果我把strlen换成siezof,结果就不一样了。name的长度显示为4,d的长度显示为6。

有点不明白。为什么用sizeof会出现差异呢?
最佳答案
2016-1-17 14:55:23
三个问题:

1. "fishc\0" 双引号的字符串会自动追加 '\0',不用自己添加,所以写 "fishc" 即可;

2. sizeof 是运算符,strlen 是计算字符个数的函数。sizeof 返回 name 为 4,是因为 name 是一个指针变量(在你的编译系统占 4 个字节),而 d 是一个数组,sizefof 会帮你计算数组的长度,也就是有多少个元素,那你这里有 6 个元素,所以返回 6。

3. 定义字符串的时候不用特别声明 unsigned char,直接 char 即可,因为标准 ASCII 码只有 127 位,所以 signed 和 unsigned 都够放哈~~~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-17 14:53:18 | 显示全部楼层
ussinged 是什么鬼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-17 14:54:45 | 显示全部楼层
siezof。。。你确定不是sizeof?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-17 14:55:23 | 显示全部楼层    本楼为最佳答案   
三个问题:

1. "fishc\0" 双引号的字符串会自动追加 '\0',不用自己添加,所以写 "fishc" 即可;

2. sizeof 是运算符,strlen 是计算字符个数的函数。sizeof 返回 name 为 4,是因为 name 是一个指针变量(在你的编译系统占 4 个字节),而 d 是一个数组,sizefof 会帮你计算数组的长度,也就是有多少个元素,那你这里有 6 个元素,所以返回 6。

3. 定义字符串的时候不用特别声明 unsigned char,直接 char 即可,因为标准 ASCII 码只有 127 位,所以 signed 和 unsigned 都够放哈~~~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-17 14:57:15 | 显示全部楼层
sizeof是返回的是指针占内存的长度 你这个char字符串就可以被看成一个指针
strlen是一直读取字符串,直到\0出现才结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-17 17:51:21 | 显示全部楼层
黑龍 发表于 2016-1-17 14:54
siezof。。。你确定不是sizeof?

额  我是在虚拟机里跑代码的
切换回windows再手打时打错了....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-17 18:05:32 | 显示全部楼层
小甲鱼 发表于 2016-1-17 14:55
三个问题:

1. "fishc\0" 双引号的字符串会自动追加 '\0',不用自己添加,所以写 "fishc" 即可;

谢谢小甲鱼~strlen确实是遇到\0就停止了


还有个问题,跟视频你演示的不一致。
比如我定义了
char b[5] = {'f','i','s','h','c'};

最后用printf打印时...并没有出现fishc*#(#*(这种,而是完整的显示了fishc...

请问这是什么原因哦...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-18 14:23:33 | 显示全部楼层
bravo 发表于 2016-1-17 18:05
谢谢小甲鱼~strlen确实是遇到\0就停止了

你定义字符串数组的时候错了
char b[6] = {'f','i','s','h','c'};
编译器会自动在后面添加一个字符“\0”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 18:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表