解析 sizeof 与 strlen

一.定义

    1.strlen函数

        strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0');它以字符为单位给出字符串长度。

     2.sizeof

        sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符;它以字节为单位给出数据的大小。

二.strlen和sizeof区别

     2.1 sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。

     2.2 sizeof还可以用函数做参数,比如:short f(); printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。

     2.3 数组做sizeof的参数不退化,传递给strlen就退化为指针了。

     2.4  大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数        的原因。

      2.5  strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。 

      2.6  sizeof后如果是类型必须加括弧(   例sizeof(char)或sizeof(float)       ),如果是特定量可以不加括弧(    例   sizeof  name  或   sizeof 8.28 )。这是因为sizeof是个操作符不是个函数。

三.几个典型例子

    1.Scanf用法

#include <stdio.h>

 

 #define SENTENCE "You are so cool."

 

 int main(void)

 {

     char name[40];

         printf("What's your name?\n");

         scanf("%s",name);

         printf("Hello,%s. %s\n",name,SENTENCE);

        return 0;

 }

 

 

[a4729821@JYstd c_size]$ gcc scan.c   

[a4729821@JYstd c_size]$ ./a.out    

What's your name?

doge wuwu

Hello,doge. You are so cool.

 

scanf( )只提取了 doge wuwu 里的 doge,它在遇到第一个空白(空格,制表符或换行符)时就不再提取输入。根据%s转换说明,scanf只会读取字符串中的第一个单词而不是整句话。C语言还有其他的输入函数(如 fget())。

 

返回值

scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。

如:

1

scanf("%d %d",&a,&b);

函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;

如果只有a被成功读入,返回值为1;

如果a和b都未被成功读入,返回值为0;

如果遇到错误或遇到end of file,返回值为EOF

 

 

 

2.sizeof 与 strlen

#include <stdio.h>                             

#include <string.h>   //Ìṩstrlenº¯ÊýÄ£ÐÍ     

#define SENTENCE "You are so cool."            

                                                

 int main(void)                                 

 {                                              

                                                

    char name[40];                             

         printf("What's your name?\n");         

         scanf("%s",name);                      

         printf("Hello,%s. %s\n",name,SENTENCE);

         printf("Your name of %d letters ocuupies %d memory cells.\n",

                 strlen(name),sizeof name);     

          printf("The sentence has %d letters.\n",strlen (SENTENCE));

          printf("The sentence ocuupies %d memory cells.\n",sizeof SENTENCE);

                                                       

         return 0;                                        

 }          

 

[a4729821@JYstd c_size]$ gcc scan.c

[a4729821@JYstd c_size]$ ./a.out

What's your name?

doge wuwu

Hello,doge. You are so cool.

Your name of 4 letters ocuupies 40 memory cells.

The sentence has 16 letters.

The sentence ocuupies 17 memory cells.

 

sizeof 运算 name数组有40个存储单元,但是只有4个单元来存储 doge 所以strlen()求出来是 4 ,数组的第五个存储单元是 \0,并没有计算进去。

 

接下来strlen计算SENTENCE的字符长度是16(包括了空格以及符号),而sizeof却是17,这时因为它将末尾不可见的\0空字符也计算在一起了

        

    

            

          

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值