首页 > 其他分享 >C语言学习笔记---sizeof关键字和strlen函数

C语言学习笔记---sizeof关键字和strlen函数

时间:2022-11-10 22:24:56浏览次数:100  
标签:关键字 C语言 --- test printf 字符串 sizeof strlen

sizeof和strlen在C语言中常用来计算字符大小和长度,在应用中却有着本质的区别。

 

sizeof是C语言中的关键字,其作用是返回一个对象或类型所占的内存字节数。使用方式为:

int i; 

sizeof(int); *//值为4*`

sizeof(i); *//值为4,等价于sizeof(int)*

sizeof(2); *//值为4,等价于sizeof(int),因为2的类型为int*

sizeof(2 + 3.14); *//值为8,等价于sizeof(double),因为此表达式的结果的类型为double*

 

strlen() 函数从字符串的开头位置依次向后计数,直到遇见\0,然后返回计时器的值。最终统计的字符串长度不包括\0。使用方式为:

char str[30] = "abc defg";  // 
printf("strlen(str) = %d \n", strlen(str)); // 带上空格总共8字符

 

上述为sizeof关键字和strlen函数的基本用法,在实际应用或面试中,应多注意两者区别:

1、sizeof关键字在编译时期就已经确定,stelen函数在运行时期确定。

int a = 1;
​
printf("%d", sizeof(a++));
printf("%d", a);

上述代码运行结果为4,1。因为sizeof是关键字,所以在第一行输出时a++不会运行,括号内的参数并不会参与计算。这也正证实sizeof关键字在编译时期已经确定,系统认为是常数。

其实上述代码也可作为分辨关键字和函数的区别,当然用指针取址的方法也可分别关键字和函数的区别。

int b = 10;
void* a = &sizeof(b);

这行代码会运行错误,如果sizeof为函数,则指针可指向sizeof的地址,但因为是关键字,取址会导致编译错误。

 

2、sizeof和strlen的结束符占有大小不同。

sizeof("\0") = 2;
strlen("\0") = 0;

strlen是计算字符串的长度,在C/C++中字符串以“\0”结尾。

sizeof计算操作数的存储大小,“\0”占两字节。

 

3、strlen返回值为size_t,为无符号整型。

char a[10] = "abcd";
char b[10] = "a";
if (strlen(b) - strlen(a) > 0) {
    printf("字符串b 比 字符串a 长 \n");
}
else {
    printf("字符串a 比 字符串b 长 \n");
}

上述代表运行结果为“字符串b比 字符串a 长 ”,导致这个输出结果的原因为size_t为无符号整型,所以strlen(b)结果为大于0的数,strlen(a)结果为大于0的数,两个size_t相减也为size_t类型,结果也一定大于0.

 

4、strlen()定义字符串数组时,一定要初始化。

char test[50];  // 未初始化
printf(" test[] = ");
for (int i = 0; i < 26; i++) {
    test[i] = 'A' + i;
    printf(" %c ", test[i]);
}
printf("\n stelen(test) = %d \r\n", strlen(test));

上述看到strlen计算出的结果是77,显示是错误的

原因:test字符串在定义时未初始化,test字符串在定义时,拿到一片内存,此时这片内存里面可能储存有值,导致使用strlen计算test字符串时找不到字符串结束标志 ’\0‘,而会在test申请的那片内存后面一直找下去,找到 ’\0‘ 后输出,计算的结果,此时输出的结果肯定错误的结果。

 

以上为网上资料和个人的一些理解,如有错误,请指正。

资料出处

https://blog.csdn.net/qq_45809384/article/details/124705939

https://blog.csdn.net/u013812502/article/details/81198452

标签:关键字,C语言,---,test,printf,字符串,sizeof,strlen
From: https://www.cnblogs.com/zhuzi1/p/16875152.html

相关文章

  • Open Cascade 多视图-多个3D视图
    ​1.简介本文介绍OCC如何实现多窗口视图以及单个窗口的多视图功能。OpenCascade7.7.0Beta中引入一个新功能:新增口来创建视图的子视图,改进对多视图的支持,以此达到在......
  • C++标准库<locale> :由islower() 函数 ----- 判断字符是否为小写字母 深入学习locale库
      C++标准库<locale>:声明:classlocale;接口:   ......
  • [Typescript] 93. Hard - Get Required
    Implementtheadvancedutiltype GetRequired<T>,whichremainsalltherequiredfieldsForexampletypeI=GetRequired<{foo:number,bar?:string}>//exp......
  • DC-2靶场渗透操作
    DC-2靶场实操一、环境配置攻击机(kali):192.168.111.128目的机(DC-2):IP未知,但在同一局域网内(得开启NAT模式)二、实验步骤1.信息收集1.1确定IP地址//通过netdiscover来确定......
  • [Typescript] 94. Hard - Get Optional
    Implementtheadvancedutiltype GetOptional<T>,whichremainsalltheoptionalfieldsForexampletypeI=GetOptional<{foo:number,bar?:string}>//expe......
  • 计算机结构--week5
    内存特征:  计算机中的内存: Capacity:Thecapacityofthememoryisthenumberofbytes(orpreferablywords)itcanstore. Thewordsize(orlength)......
  • vue-什么是虚拟dom?
    什么是虚拟dom?本质上是一个普通的JS对象,用来模拟DOM结构。(Vue内部有一个虚拟DOM转义器,会把真实DOM转成一个对象)组件在渲染的时候,会调用render函数,这个函数会生......
  • CVE-2017-7921 漏洞复现
    声明本文内容仅供学习交流使用,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者无关。 一、漏洞介绍1.许多HikvisionIP相机包含一个后门,允......
  • 2022-11-10学习内容
    1.案例-购物车-加入购物车1.1ShoppingChannelActivity.javapackagecom.example.chapter06;importandroidx.appcompat.app.AppCompatActivity;importandroid.net.......
  • MySql - 基础学习 - 索引
    CREATETABLE`app_user`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENT,`name`VARCHAR(50)DEFAULT''COMMENT'用户昵称',`email`VARCHAR(50)NOTNULLCOMME......