bravo 发表于 2016-1-17 11:15:48

sizeof和strlen

我在虚拟机里的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:53:18

ussinged 是什么鬼

黑龍 发表于 2016-1-17 14:54:45

siezof。。。你确定不是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 都够放哈~~~

{:10_273:}

黑龍 发表于 2016-1-17 14:57:15

sizeof是返回的是指针占内存的长度 你这个char字符串就可以被看成一个指针
strlen是一直读取字符串,直到\0出现才结束

bravo 发表于 2016-1-17 17:51:21

黑龍 发表于 2016-1-17 14:54
siezof。。。你确定不是sizeof?

额我是在虚拟机里跑代码的
切换回windows再手打时打错了....

bravo 发表于 2016-1-17 18:05:32

小甲鱼 发表于 2016-1-17 14:55
三个问题:

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


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


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

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

请问这是什么原因哦...

ligen超越 发表于 2016-1-18 14:23:33

bravo 发表于 2016-1-17 18:05
谢谢小甲鱼~strlen确实是遇到\0就停止了




你定义字符串数组的时候错了
char b = {'f','i','s','h','c'};
编译器会自动在后面添加一个字符“\0”
页: [1]
查看完整版本: sizeof和strlen