C语言中sizeof与strlen区别
- 格式:pdf
- 大小:65.59 KB
- 文档页数:3
C语⾔关键字详解</h1> 相对于其他语⾔来说,C语⾔的关键字算是少的了。
在C98中关键⼦总共只有32个,我们来分析⼀下每个关键字在C语⾔中它独特的作⽤。
1、关于数据类型的关键字 (1) char :声明字符型变量或函数 (2) double :声明双精度变量或函数 (3) enum :声明枚举类型 enum类型可以增加可读性,可移植性;在enum中定义的每个对象,默认都是从0开始,当然也可以⾃定义。
如下:enum Color{RED,BLACK,WHITE};enum Number{ONE=1,TWO,THREE}; Color中RED=0,BLACK=1,WHITE=2; Number中ONE=1,TWO=2,THREE=3; (4) float:声明浮点型变量或函数 (5) int:声明整型变量或函数 (6) long :声明长整型变量或函数 (7) short :声明短整型变量或函数 (8) signed:声明有符号类型变量或函数 (9) struct:声明结构体变量或函数 结构体struct的作⽤已经在上⼀篇博⽂中讲到,可以⽤来实现C语⾔的封装,继承,多态等等。
union类型可以⽤来提⾼内存的使⽤率,如下:int main(){union Unoin{int a;float b;char *c;};union Unoin p;p.a = 100;/*执⾏语句1*/p.b = 10.0;/*执⾏语句2*/p.c = "hello world!";/*执⾏语句3*/<span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">} 如果不使⽤union,我们需要分别定义int,float,cahr*,需要占⽤12字节的内存空间,但是当我们使⽤union时,只需要占⽤4字节即可;但是需要注意的时,我们在上⾯那个代码中执⾏语句2或者3中需要⽤到int a时,就⽆法使⽤union 了,必须单独定义int a;否则读出的a值将会错误的。
strlen和sizeof的区别strlen 是⼀个库函数,计算传进来的字符串的长度,以 ‘\0’结尾sizeof 是⼀个运算符,它计算的是传进来的指针在内存中所占空间⼤⼩,在编译时就已经获得了结果。
C语⾔中没有字符串,⽤的是字符数组来模拟字符串。
C风格的字符串时字符数组然后在末尾加0表⽰结尾。
//在C语⾔中有strlen和sizeof两个函数求字符数组的长度函数,他们俩的区别就是是否把最后的结束标志也加上去。
//错误//strlen是不加的,他表⽰字符串的长度。
//错误⽽sizeof求的是字符串在内存中的长度,所以它是加上最后的'\0'的//所以⼀般⽽⾔后者的长度会⽐前者多1。
//错误#include<stdio.h>#include<string.h>int main(){char buf[] = "abcd";printf("sizeof(buf) = %d\n",sizeof(buf));printf("strlen(buf) = %d\n",strlen(buf));return1;}运⾏结果:exbot@ubuntu:~/shareWin/CAndC++$ ./sizeofandstrlensizeof(buf) = 5strlen(buf) = 4它们相差 1 并不是 sizeof 和 strlen 的问题,⽽是 buf 没有指定空间⼤⼩,直接初始化后需要多少空间在后⾯+1,所以表现出来的效果显⽰成sizeof结果⽐strlen⼤1strlen计算的是字符串到'\0'位置的⼤⼩sizeof计算的字符串占的内存⼤⼩#include<stdio.h>#include<string.h>int main(){char str[100] = {0};strcpy(str, "abcd");int str_len = strlen(str);int str_size = sizeof(str);printf("strlen(str) = %d\n", (str_len));printf("sizeof(str) = %d\n", (str_size));return0;}运⾏结果:ubuntu@ubuntu:~/workspace/test$ gcc sizeofAndStrlen.c -o sizeofAndStrlenubuntu@ubuntu:~/workspace/test$ ./sizeofAndStrlenstrlen(str) = 4sizeof(str) = 100。
字符串的sizeof长度及strlen长度在C/C++中,字符串是以零('\0')结尾的。
⽐如,对于下⾯的字符串:"hello"在最后⼀个字符'd'后⾯,还有⼀个我们⾁眼看不见的'\0'字符,作为该字符串的结束符。
所以,"Hello"其在内存中的存储形式为:'H' 'e' 'l' 'l' 'o' '\0'最后有⼀个我们看不见的'\0'。
明⽩了字符串的结尾⽅式,那么如何计算字符串的长度呢?⽐如:例题1:char str1[]="12345678";char str2[]={'1','2','3','4','5','6','7','8'};char str3[]={'1','2','3','\0','5','6','7','8'};sizeof(str1)=?sizeof(str2)=?sizeof(str3)=?strlen(str1)=?strlen(str2)=?strlen(str3)=?分析:str1是⼀个字符数组,由字符串"12345678"进⾏初始化。
由于"12345678"含有⼀个结尾字符'\0',所以str1数组共有9个字符。
因此sizeof(str1)=9。
str2也是⼀个字符数组,它的长度由'1','2','3','4','5','6','7','8'8个字符初始化,并没有指明零字符。
C语⾔字符串替换:字符,字符串,字符数组详解⽬录案例描述案例分析必备知识1,字符数组(1)字符数组的定义(2)字符数组的初始化2,字符串概念(1)字符串的概念(2)⽤字符初始化字符数组(3)获取字符串的长度3,字符串与指针4,字符数组与字符指针总结案例描述字符串替换是处理字符串时最常见的操作之⼀,也是学习字符串必须掌握的知识。
本案例要求通过编程实现字符串“Good moring”到“Good evening”的转换。
案例分析我们需要从字符串中被替换的位置开始,将要替换的内容逐个复制到原字符串中,直到字符串结束或者替换的字符串结束为⽌。
为了顺利完成案例,需要先学习字符数组,字符串,字符指针等基础知识。
必备知识1,字符数组字符数组是存放字符数据的数组,其中每⼀个元素都是单个字符(1)字符数组的定义字符数组定义的语法格式如下:char 数组名[常量表达式];char 数组名[常量表达式1][常量表达式2]在上述语法中,分别列举了定义⼀维字符数组和⼆维字符数组的⽅法。
⽰例代码如下:char ch[6];(2)字符数组的初始化在数组定义的同时也可以对数组中的元素进⾏赋值,这个过程称为数组的初始化,⽰例代码如下:char c[5] = {'h','e','l','l','o'};注意字符数组的初始化很简单,但要注意以下⼏点。
(1)元素个数不能多于字符数组的⼤⼩,否则编译器会出错(2)如果初始项少于数组长度,则空余元素均会被赋值为空字符(‘\0')(3)如果没有指定数组⼤⼩,则编译器会根据初始项的个数为数组分配长度(4)也可以初始化⼆维数组(和整型数组基本⼀致)2,字符串概念(1)字符串的概念字符串是由数字、字母、下划线和空格等各种字符组成的⼀串字符,是个常量,字符串的末尾都默认有⼀个'\0'作为结束符。
"abcde"" "上⾯这两⾏都是字符串,只不过第⼆个字符串中的字符都是空格字符串在各种编程语⾔中都是⾮常重要的数据类型,但是C语⾔中没有字符串的固定类型,通常⽤字符数组的形式来存储和处理字符串,这种字符数组必须以'\0'结尾。
strlen函数与sizeof的区别,C语言strlen与sizeof 的区别详解strlen 是一个函数,它用来计算指定字符串str 的长度,但不包括结束字符(即null 字符)。
其原型如下面的代码所示:size_t strlen(char const* str);也正因为strlen 是一个函数,所以需要进行一次函数调用,调用示例如下面的代码所示:1.char sArr[]="ILOVEC";2./*用strlen()求长度*/3.printf("sArr的长度=%d\n",strlen(sArr));很显然,上面示例代码的运行结果为6(因为不包括结束字符null)。
这里需要特别注意的是,函数strlen 返回的是一个类型为size_t 的值,从而有可能让程序导致意想不到的结果,如下面的示例代码所示:1./*判断一*/2.if(strlen(x)>=strlen(y))3.{4.}5./*判断二*/6.if(strlen(x)-strlen(y)>=0)7.{8.}从表面上看,上面的两个判断表达式完全相等,但实际情况并非如此。
其中,判断表达式一没什么问题,程序也能够完全按照预想的那样工作;但判断表达式二的结果就不一样了,它将永远是真,这是为什么呢?原因很简单,因为函数strlen 的返回结果是size_t 类型(即无符号整型),而size_t 类型绝不可能是负的。
因此,语句“if(strlen(x)-strlen(y)>=0)”将永远为真。
同样,就算表达式中同时包含了有符号整数和无符号整数,还是有可能产生意想不到的结果,如下面的代码所示:1./*判断一*/2.if(strlen(x)>=5)3.{4.}5./*判断二*/6.if(strlen(x)-5>=0)7.{8.}很显然,判断表达式二的结果还是永远是真,其原因与上面相同。
任务名称:strlen和sizeof的区别及用法详解一、背景介绍在编程过程中,我们常常会涉及到字符串的长度计算以及数据类型的大小计算,这时就会用到两个关键字:strlen和sizeof。
虽然这两个关键字都与计算长度有关,但它们使用的场景和计算方式却略有不同,本文将对它们的区别进行详细讨论。
二、strlen关键字2.1 strlen的定义及作用strlen是一个C语言标准库函数,其函数原型为size_t strlen(const char *s)。
它的作用是计算字符串的长度,即字符串中字符的个数。
2.2 strlen的使用方法使用strlen函数需要引用头文件<string.h>。
它的参数是一个指向字符串的指针,返回值是一个无符号整型数。
下面是一个使用strlen函数的简单示例:#include <stdio.h>#include <string.h>int main() {char str[] = "Hello World";size_t len = strlen(str);printf("字符串的长度为:%zu\n", len);return 0;}2.3 strlen的注意事项•传入的参数必须是以null结尾的字符串,即字符串的最后一个字符必须是null字符\0。
•字符串长度不包括null字符本身。
•如果传入的参数是一个空指针,则strlen函数的行为是未定义的。
•如果传入的参数不是以null结尾的字符串,strlen函数可能会访问到非法内存,导致程序崩溃或产生不确定的结果。
三、sizeof关键字3.1 sizeof的定义及作用sizeof是一个操作符,可以计算数据类型或变量的大小,即所占用的字节数。
它返回一个size_t类型的值,表示数据类型或变量所占用的字节数。
3.2 sizeof的使用方法sizeof操作符的参数可以是数据类型、变量或表达式。
C++获取字符串长度的⼏个函数⽅式C/C++ strlen(str)、str.length()、str.size()、sizeof(str)都可以求字符串长度。
其中str.length()、str.size()、sizeof(str)是⽤于求string类对象的成员函数strlen(str)是⽤于求字符数组的长度,其参数是char*。
补充知识:获取字符串长度的函数sizeof()、strlen()、length()、size()详解和区别在C++中计算长度的函数有四种,它们分别是sizeof() ,size(),strlen(),str.length()。
⼀. sizeof()和strlen()两者区别:1)sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
2)sizeof是运算符,strlen是函数。
3)sizeof可以⽤类型做参数,strlen只能⽤char*做参数,且必须是以''\0''结尾的。
4)sizeof在编译时期就计算出来,strlen在运⾏之后才能计算出来。
5)strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符。
返回的是字符个数。
sizeof计算声明后所占的内存数(字节⼤⼩),不是实际长度。
举例:1)char* ss = "0123456789";sizeof(ss)为4,ss是指向字符串常量的字符指针,sizeof 获得的是指针所占的空间,则为4sizeof(*ss)为1,*ss是第⼀个char字符,则为12)char ss[] = "0123456789";sizeof(ss)为11,ss是数组,计算到'\0'位置,因此是(10+1)sizeof(*ss)为1,*ss是第⼀个字符3)char ss[100] = "0123456789";sizeof(ss)为100,ss表⽰在内存中预分配的⼤⼩,100*1strlen(ss)为10,它的内部实现⽤⼀个循环计算字符串的长度,直到'\0'为⽌。
Sizeof与Strlen的区别与联系1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是运算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:short f();printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。
char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。
这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。
9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如:fun(char [8])fun(char [])都等价于 fun(char *)在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。
如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度。
习题3 参考答案一、选择题3.1 C 分析:本题考查程序和数组的基本概念。
3.2 A 分析:字符串比较大小是以第1个不相同字符的大小为标准的,跟长度没有关系,B选项不正确;字符串比较大小除了使用库函数strcn3()以外,就只能靠自己写代码来实现了,而不能通过关系运算符来比较大小。
因为字符串在表达式中相当于const char*,即常字符指针,代表的是字符串的首地址,关系运算符会将两个字符串的首地址值比较大小,这是毫无意义的。
C选项不正确。
C语言中只有字符串常量而没有字符串变量,D选项描述不正确;空串的长度为0,而以空格打头的字符串的长度至少为1,因此A选项是正确。
3.3 A 分析:如果第一维的长度没有指定,则定义的同时需要完成初始化,否则不知道分配多大的内存空间给它,所以选项B、C错误;二维数组a[2][3]中只有两个元素,都是一维数组,一维下标最大只能是a[1],所以选项D错误;若完成初始化的二维数组,第一维的长度没有指定,则第一维的大小按如下规则确定:若初值个数能被第二维大小整除,所得的商就是第一维的大小,若不能整除,则所得的商加1作为第一维的大小,所以选项A相当于:double a[1][3] = {6};其中a[0][0]=6,其他元素赋值0,选项A正确,答案为A。
3.4 D 分析:本题考察的知识点是:字符串常量。
在C语言中,字符串常量是以双引号括起来的字符序列。
因此B选项和C选项不正确。
字符序列中可包含一些转义字符,转义字符都是以"\"开头的。
A选项中包含了三个"\",前两个(\\)代表了一个"\"字符,后面一个和"""一起(\")被看作一个""",所以该字符串缺少一个结束的""",因此不正确。
D选项的两个"""之间没有任何字符,代表的是一个空串,是合法的字符串常量,因此D选项正确。
C语⾔字符串长度(转)C语⾔字符串长度的计算是编程时常⽤到的,也是求职时必考的⼀项。
C语⾔本⾝不限制字符串的长度,因⽽程序必须扫描完整个字符串后才能确定字符串的长度。
在程序⾥,⼀般会⽤strlen()函数或sizeof来获取⼀个字符串的长度,但这2种⽅法获取的字符串的长度其实是不⼀样,我们⽤如下函数进⾏测试:1 #include<stdlib.h>2 #include<string.h>3 #include<stdio.h>4int main() {56char s1[20] = "hello world";7char s2[20] = {'h','e','l','l','0','','w','o','r','l','d','\0'};8char s3[] = "hello\0 world";9char s4[] = {'h','e','l','l','0','\0','','w','o','r','l','d','\0'};1011 printf("%d\t%d\t%d\t%d\n",strlen(s1),strlen(s2),strlen(s3),strlen(s4));12 printf("%d\t%d\t%d\t%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4));13 }注意,该函数⾥⾯定义了4个字符串,基本数据都是“hello world",但需要注意的是,字符串s1和s2给定了字符串数组的⼤⼩为20,然后使⽤2种⽅式进⾏赋值;字符串s3和s4是s1和s2对⽐的字符串,区别就是s3和s4字符串中间插⼊了⼀个'\0'。