strlen函数_关于sizeof()和strlen(),你想要的笔试题和陷阱都在这里。

178987663d1113a586c6969d0ef1510e.png

作者 | Lee

对于sizeof()和strlen(),很多初学C语言的同学会搞乱掉,这里就来给大家详细的总结下,什么时候该用sizeof(),什么时候该用strlen(),以及在面试的时候,会遇到哪些陷阱。

以下程序均在 32 位操作系统上运行!

sizeof()

1、sizeof()用于计算数据类型的长度

常见的用法有:

sizeof()加上普通数据类型

sizeof(int);         //结果是4sizeof(char);        //结果为1

sizeof()加上数组

char a[5] = {0};sizeof(a);           //结果为5int b[5] = {0};sizeof(b);           //结果为 4 * 5 = 20char c[] = {1, 2, (3, 4), 5};sizeof(c);          //结果为4

sizeof()加上数组元素

int a[5] = {0};sizeof(a[1]);        //结果为4

sizeof()加上指针(地址)

sizeof(int *);      //结果为8int a;sizeof(&a);         //结果为8char b[5] = {0};sizeof(&b);         //结果为8 

sizeof()加上奇怪的东西

int a[] = {1, 2, 3, 4};sizeof(*a);         //结果为4sizeof(*&a);        //结果为20/*注意*/sizeof(a + 1);      //结果为4int b[2][3] = {{1, 2, 3}, {4, 5, 6}};sizeof(b[0]);      //结果为12sizeof(b[0] + 1);  //结果为4sizeof(&b[0]);     //结果为4sizeof(*(b[0] + 1));   //结果为4

sizeof()需要计算出表达式的类型,分为数组、指针、普通类型三种,如果是指针的话,不管是几级地址,结果都是4(32位操作系统)。

2、sizeof()是关键字,不是函数

如何证明?

#include int main(){    int a = 1;        printf("%lu\n", sizeof(a++));    printf("%d\n", a);        return 0;}

结果:

root@turbo:~# ./test 41root@turbo:~# 

如果sizeof()是函数,在执行函数之前,会先算出参数的结果。但是从结果可以看出,参数a的值并没有变,所以sizeof()不是函数,只是C语言中的一个关键字。

strlen()

strlen()用于计算字符串长度,参数是字符串的首地址。strlen()函数遇到字符'\0'结束,所以要求字符串必须是合法的字符串,以'\0'结束。

1、用字符串常量作参数

strlen("helloworld");       //结果为10

2、用指针作参数

char *s = "helloworld";strlen(s);                  //结果为10

3、用数组名作参数

char str[] = "helloworld";strlen(str);                //结果为10char s[5] = {'a', 'b', 'c', 'd', 'e'};strlen(s);                  //随机值(字符串没有'\0')int num[] = {1, 2, 3, 4, 5};strlen((char *)num);       //随机值(取决于数组里面的数值)char n[] = {1, 2, 3, 4, 5};strlen(n);                 //随机值(字符串没有'\0')/*以上两种情况虽然是数字,也可以计算长度,原则就是遇到'\0'即一个字节全是0结束*/char m[5] = {1, 2, 3};strlen(m);                //结果为3

4、用奇怪的东西作参数

char arr[2][3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};strlen((char *)arr);        //随机值(没有遇到'\0')char arr[2][3] = {{'a', 'b'}, {'d', 'e', 'f'}};strlen((char *)arr);        //结果为2char arr[2][4] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};strlen(arr[0]);             //结果为3

以上基本上涵盖了sizeof()和strlen()的所有内容。笔试题千变万化,但是万变不离其中,sizeof()需要计算数参数的类型,strlen()需要根据地址找到字符串所在内存,遇到'\0'结束,掌握这两个原则,就不会出什么问题。

2444ea01cc6c17055626ffcb2a3f596d.png

c32cad12159aead45a070bbb16e6763f.png

e195efaee2438b005ef109365d250d28.png

eeed68e4272eae10f915b8367be77121.png

eedfc89edadf53f388ed4a23f6f5295b.png

5b9e31d45283d328caedc96ff75c0ef7.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值