字符数组和字符串的sizeof( )和strlen()

合集下载

C语言开发基础教程(Dev-C++) 第7章 字符串

C语言开发基础教程(Dev-C++) 第7章 字符串


7.1.2 字符串
小提示:'\0'字符 字符串其实就是一个以空字符'\0'结尾的字符数组,在定义存储字符 串的数组时,要手动在数组末尾加上'\0',或者直接使用字符串对数 组进行初始化。

7.1.2 字符串
字符数组的输出: 字符数组可以通过%s格式化输出,直接输 出数组名。 char char_array[6] = {"hello"}; printf("%s", char_array); //结果为hello

7.2.1 常见的输入函数
2、getchar()函数 getchar()函数用于从标准输入中读取一个字符,其函数声明如下: int getchar(void); getchar()没有参数,可直接使用,其返回值为读取到的字符。

7.2.1 常见的输入函数
3、gets()函数 gets()函数用于读取一个字符串,其函数声明如下: char *gets(char *str); gets()函数读取换行符之前的所有字符(不包括换行符本身),并在字 符串的末尾添加一个空字符‘\0’用来标记字符串的结束,读取到的字 符串会以指针形式返回。

第7章 字符串
·字符数组与字符串 · 字符串指针 · 字符串的输入输出
· 字符串操作函数 · 数字与字符串转换 · 阶段案例

7.1 字符数组和字符串
字符数组是由字符类型的元素所组成 的数组,字符串就存储在字符数组中, 在访问字符数组时,可使用下标法读 取指定位置的字符,也可使用%s格式 将字符数组中的元素以字符串的形式 全部输出。

7.3.1 字符串比较函数

c语言字符串数组定义的几种方式

c语言字符串数组定义的几种方式

C语言中,字符串数组是一个很常见的数据类型。

在定义字符串数组的过程中,有几种方式可以使用,每种方式都有其特点和适用场景。

接下来,我将从浅入深地介绍这几种方式,并对其进行全面评估。

1. 使用字符数组来定义字符串数组在C语言中,可以使用字符数组来定义字符串数组。

例如:```char strArray[3][20] = {"hello", "world", "c语言"};```这种方式是最基础的定义字符串数组的方法。

它的优点是简单直接,容易理解和使用,适用于简单的场景。

但缺点是不够灵活,每个字符串的长度都是固定的,不能动态调整。

2. 使用指针数组来定义字符串数组除了使用字符数组,还可以使用指针数组来定义字符串数组。

例如:```char *strArray[3] = {"hello", "world", "c语言"};```这种方式相比于字符数组更加灵活,每个字符串的长度可以动态调整。

但要注意的是,需要手动管理每个字符串的内存空间,避免出现内存泄漏等问题。

3. 动态分配内存来定义字符串数组另一种方式是动态分配内存来定义字符串数组。

这种方式可以在运行时动态申请和释放内存,非常灵活。

例如:```char **strArray;strArray = (char **)malloc(3 * sizeof(char *));for (int i = 0; i < 3; i++) {strArray[i] = (char *)malloc(20 * sizeof(char));}strcpy(strArray[0], "hello");strcpy(strArray[1], "world");strcpy(strArray[2], "c语言");```这种方式虽然灵活,但需要手动管理内存,容易出现内存泄漏和指针错误等问题,需要谨慎使用。

字符串的sizeof长度及strlen长度

字符串的sizeof长度及strlen长度

字符串的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++中数字与字符串之间的转换scanfstring总结(复习必读)

C++中数字与字符串之间的转换scanfstring总结(复习必读)

C++中数字与字符串之间的转换scanfstring总结(复习必读) 1 string的scanf读⼊操作C++⾥⾯控制台输⼊直接使⽤cin操作就可以了;或者getline(istringstream,string);字符和数字加减就是字符的ASCII码和数字直接加减。

只有内置类型int,float,char,double,bool可以直接赋值,scanf读⼊string不能直接使⽤scanf直接赋值,因为string是⼀个类class,有专门的初始化函数,不能使⽤scanf,同理gets接收的也是⼀个char指针。

编程语⾔⾃带的sizeof也是⼀样,不能对string进⾏直接操作。

string s;s.resize(100);scanf("%s",&s[0]);或者:string s;char *c = new char(100);scanf("%s",c);//scanf("%s",&c[0]);s = c;//给⾸地址strlen是得到输⼊的有效字符串,⽽不是开辟的空间⼤⼩100.strlen所作的仅仅是⼀个计数器的⼯作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚⾄是某个不确定的内存区域)开始扫描,直到碰到第⼀个字符串结束符'\0'为⽌,然后返回计数器值。

--就是指实际字符串或字符数组的实际长度(不是所占空间的字节数)。

char A[6]={'a','b','\0','d','e','r'};int i=strlen(A); //i为2,因为到’\0’结束,故实际A[]只有2个元素sizeof()string s;char *c = new char(100);scanf("%s",c);int len = strlen(c);s1.resize(len);//动态编译s1.assign(c,c + len);//copy(c,c + len,s1.begin());针对其他结构class X { int i; int j; char k; }; X x;cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐cout<<sizeof(x)<<endl; 结果 12 同上解释⼀下,在class X中,成员中最⼤的所占的空间为int类型所占的空间4个字节,故内存补齐,最后结果为: ((int)(实际成员所占内存空间的和/4)+1)*4*所以不能通过sizeof(string) / sizeof(string[0])得到实际char元素个数,不管string等于多少,最后的结果都是28;因为string是⼀个class。

strlen总结

strlen总结

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

头文件:cstring string.h功能:计算给定字符串的长度区别sizeofstrlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

char aa[10];cout<<strlen(aa)<<endl; //结果是不定的char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3(此处不完全正确,结果可能是不定的,如果编译器将其他的非零字符串放在aa[10]的内存地址后,strlen结果还是不定的,MSP430在IAR编译测试过)(但是在vc6中结果为3,编译器会在“处自动添上\0。

)char aa[5]="hello";cout<<strlen(aa)<<endl; //结果5(此处不完全正确,理由如上,因为实际内存中,hello后面不一定是空(即\0))(还应视编译器而定)而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个取字节运算符,strlen是函数。

sizeof(aa) 返回10int a[10]; sizeof(a) 返回40 (根据语言int型c 是四个字节c++是四个java 是两个)⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。

C语言字符串替换:字符,字符串,字符数组详解

C语言字符串替换:字符,字符串,字符数组详解

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的题目

strlen和sizeof的题目

任务名称: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操作符的参数可以是数据类型、变量或表达式。

架构师面试中常见的数据结构与算法题(60题)

架构师面试中常见的数据结构与算法题(60题)

架构师面试题 -常见的数据结构与算法 数组(共30题,含答案)1.矩阵中的⾏列数可以是不相等的,这样的说法正确吗?A.正确B.不正确2.对矩阵压缩存储是为了A.⽅便运算B.⽅便存储C.提⾼运算速度D.减少存储空间3.⼀维数组与线性表的区别是A.前者⻓度固定,后者⻓度可变B.后者⻓度固定,前者⻓度可变C.两者⻓度均固定D.两者⻓度均可变4.在以下的叙述中,正确的是A.线性表的顺序存储结构优于链表存储结构B.⼆维数组是其数据元素为线性表的线性表C.栈的操作⽅式是先进先出D.队列的操作⽅式是先进后出5.顺序存储⽅式插⼊和删除时效率太低,因此它不如链式存储⽅式好。

A.TB.F6.数组是⼀种线性结构,因此只能⽤来存储线性表A.对B.错7.设有⼀个⼆维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在676(10),每个元素占⼀个空间,问A[3][3](10)存放在什么位置?脚注(10)表示⽤10进制表示A.688B.678C.692D.6968.定义了⼀维int 型数组a[10] 后,下⾯错误的引⽤是A.a[0] = 1;B.a[0] = 5*2;C.a[10] = 2;D.a[1] = a[2] * a[0];9.在⼀个⻓度为n的顺序表中删除第i个元素,要移动_______个元素。

如果要在第i个元素前插⼊⼀个元素,要后移_________个元素。

A.n-i,n-i+1B.n-i+1,n-iC.n-i,n-iD.n-i+1,n-i+110.已知10*12 的⼆维数组A ,以⾏序为主序进⾏存储,每个元素占1 个存储单元,已知A[1][1] 的存储地址为420 ,则A[5][5] 的存储地址为A.470B.471C.472D.47311.取线性表的第i个元素的时间同i的⼤⼩有关。

A.TB.F12.若要定义⼀个具有5 元素的整型数组,以下错误的定义语句是A.int a[5] = {0};B.int a[] = {0, 0, 0, 0, 0};C.int a[2+3];D.int i = 5, a[i];13.⻓度为n 的⾮空顺序表,若在第i个位置插⼊新的元素X,则i的取值范围是1≤i≤n+1,需要移动的元素个数为A.iB.n-i-1C.n-iD.n-i+114.设有⼀个10阶的对称矩阵A,采⽤压缩存储⽅式,以⾏序为主存储,a11为第⼀元素,其存储地址为1,每个元素占⼀个地址空间,则a85的地址为A.13B.33C.18D.4015.设⼀维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为A.O(n)B.O(nlog2n)C.O(1)D.O(n2)16.定义语句"double * array [8]"的含义正确的是A.array是⼀个指针,它指向⼀个数组,数组的元素时是双精度实型B.array是⼀个数组,数组的每⼀个元素是指向双精度实型数据的指针CC语⾔中不允许这样的定义语句D.以上都不对17.有⼀个⽤数组C[1..m]表示的环形队列,m为数组的⻓度。

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系

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 的时候,通常是计算字符串数组的长度。

c语言中strlen

c语言中strlen

c语言中strlenstrlen指的是计算字符串长度的库函数名。

str:通常,程序员喜欢用它作字符串变量名。

它是string(英文词字符串的缩写)。

len:通常,程序员喜欢用它作变量名。

它是length(英文词长度的缩写)。

strlen介绍:strlen是C语言标准函数库中的标准函数,其功能是:计算字符串的长度,strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。

c语言介绍:c语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。

C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。

C语言编译器普遍存在于各种不同的操作系统中,其设计也影响了Java、Python等编程语言。

C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象编程语言有所不同。

C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

C 语言描述问题比汇编语言迅速,工作量小、可读性好,易于调试、修改和移植,而代码质量与汇编语言相当。

优点介绍:C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。

C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。

不同的变量类型可以用结构体(struct)组合在一起。

c语言获取数组长度的函数

c语言获取数组长度的函数

c语言获取数组长度的函数在C语言中,数组是一种数据结构,它可以存储一系列具有相同数据类型的元素。

当我们使用数组时,有时需要获取数组的长度。

C语言本身并没有提供获取数组长度的内置函数,但可以通过一些方法来实现。

方法一:使用sizeof运算符sizeof运算符可以用于获取数组的字节数。

因此,通过将数组的总字节数除以单个元素的字节数,我们可以计算出数组中元素的个数。

例如,假设我们有一个名为arr的整数数组,其元素类型大小为4字节,则可以使用以下代码获取数组长度:int arr[5] = { 1, 2, 3, 4, 5 };int arr_len = sizeof(arr) / sizeof(arr[0]);在上面的代码中,sizeof(arr)返回整个数组的字节数,而sizeof(arr[0])返回一个数组元素的字节数。

因此,将数组的总字节数除以单个元素的字节数即可计算出数组中元素的个数。

但是,需要注意的是,如果将上面的代码应用于指针和动态分配的数组,则不起作用。

因为指针指向的是内存地址,其大小由系统决定,而不是指向的数组元素的个数。

同样,在动态分配数组时,必须手动跟踪数组的长度。

方法二:使用自定义函数除了使用sizeof运算符外,我们也可以自定义一个函数来获取数组长度。

以下是一个可能的实现:int calc_array_len(int arr[]) {int len = 0;while (arr[len] != '\0') {len++;}return len;}该函数使用了一个while循环来迭代数组中的元素。

当遇到null 字符时,停止迭代并返回数组长度。

需要注意的是,此处的null字符是指数组结束符,而不是C语言中的NULL,因为数组元素可以是任何基本数据类型,而不仅仅是指针。

这种自定义函数的缺点是,在实际使用中需要统一约定数组结束符。

因此,在某些情况下可能不太实用。

方法三:使用C++ STL中的数组模板如果您的程序同时使用了C++ STL,请考虑使用std::array模板来定义数组。

c语言strlen的意思

c语言strlen的意思

c语言strlen的意思
C语言中的strlen()函数用于计算字符串的长度,即字符串中
包含的字符的个数(不包括字符串末尾的空字符'\0')。

该函数的
原型为size_t strlen(const char str),其中str为要计算长度
的字符串,返回类型为size_t,即无符号整数类型。

strlen()函数会从字符串的开头开始逐个检查字符,直到遇到
字符串末尾的空字符'\0'为止,然后返回字符的个数。

这个函数对
于确定字符串的长度非常有用,特别是在需要动态分配内存或者进
行字符串操作时很常用。

需要注意的是,strlen()函数只能用于计算以空字符'\0'结尾
的字符串的长度,如果字符串中没有空字符'\0',则该函数会导致
未定义的行为。

因此,在使用strlen()函数时,必须确保所操作的
字符串是以'\0'结尾的合法字符串。

除了计算字符串的长度外,strlen()函数还可以用于判断字符
串是否为空,即当返回的长度为0时,可以判断字符串为空。

另外,strlen()函数也可以用于比较两个字符串的长度,从而进行字符串
的大小比较。

总之,strlen()函数在C语言中是一个非常常用且重要的函数,它能够帮助我们处理字符串并获取字符串的长度信息,是C语言中
不可或缺的一部分。

c语言strlen的类型

c语言strlen的类型

c语言strlen的类型在C语言中,strlen是一个非常常用的函数,它用于计算一个字符串的长度,即字符串中的字符数量(不包括结束符'\0')。

strlen 的原型定义在C语言的头文件<string.h>中,其函数原型如下所示:```size_t strlen(const char *str);```strlen函数接收一个指向字符数组的指针作为参数,并返回一个无符号整数(unsigned size_t),表示字符串的长度。

由于返回类型是size_t,而不是int类型,主要是为了确保能够表示大于INT_MAX 的长度。

需要注意的是,strlen函数只适用于以空字符'\0'结尾的字符串,对于没有结束符的字符数组,其行为是不确定的。

strlen函数的工作原理是遍历输入的字符串数组,直到找到结束符'\0'为止,并返回计数的字符数量。

以下是一个示例代码,展示了strlen函数的基本用法:```c#include <stdio.h>#include <string.h>int main() {char str[] = "Hello, world!";size_t len = strlen(str);printf("String length: %zu\n", len); return 0;}```运行以上代码,输出结果为:```String length: 13```可以看到,strlen函数返回的结果是字符串"Hello, world!"的字符数量,不包括结束符'\0'。

由于strlen函数是计算字符串长度的常用工具,它在字符串操作、输入输出、字符串比较等许多场景中都有广泛的应用。

下面是一些具体的使用场景:1.字符串长度判断:strlen函数可以帮助我们判断一个字符串是否为空或者是否超出了预设的长度限制。

sizeof()函数用法汇总

sizeof()函数用法汇总

sizeof()函数用法汇总1. 与strlen()比较strlen计算字符数组的字符数,以“\0"为结束符,不计算“\0"为数组元素。

sizeof()计算数据(数组、变量、类型、结构体等)所占空间,用字节数表示。

2.指针与静态数组的sizeof操作指针均可看为变量类型的一种,所有指针变量的sizeof操作结果均为4 。

(这个已实践证明)所以不要用下面的方式去计算一个字符数组的长度:char *a= "nihaomao";int count = sizeof(a);//返回值为4而应该使用下面的方式计算:char a[] = "nihaomao";int count = sizeof(a);返回值为1*8=8int a[10];sizeof(a)则返回值为4*10=40 。

PS:数组做形参时,数组名称被当做指针使用。

例如:(已验证)void fun(char p[]) {sizeof(p); //返回值为4}经典问题:double* (*a)[3][6];cout<<sizeof(a)<<endl; // 4 a为指针cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。

既然是指针,所以sizeof(a)就是4。

既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。

sizeof和strlen的区别

sizeof和strlen的区别

博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
sizeof和 strlen的ቤተ መጻሕፍቲ ባይዱ别
一、指代不同 1、sizeof:用于获取字符串的长度,是处理字符串的重要工具。 2、strlen:所作的是一个计数器的来工作。 二、规则不同 1、sizeof:可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,不需要用圆括号自。 2、strlen:从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结知束符'\0'为止,然后返回计数器值。 三、用法不同 1、sizeof:sizeof( type_name ); // sizeof( 类型 );编译时起作用道,而不是运行时。 2、strlen:extern unsigned int strlen(char *s);返回s的长度,不包括结束符NULL。

辨析C语言中的strlen和sizeof函数

辨析C语言中的strlen和sizeof函数

辨析C语言中的strlen和sizeof摘要:strlen函数和sizeof运算符是C语言中两个比较相像的知识点,运用起来容易混淆,文章首先从二者的定义来区分,其次是通过字符串和字符数组的长度来比较二者的不同,最后是通过strlen函数和sizeof运算符所跟内容来辨析它们的不同。

关键词:C语言;strlen函数;sizeof运算符strlen函数和sizeof运算符是C语言中比较重要的知识点,目前各种权威期刊就strlen和sizeof还没有一篇做详细辨析的文章。

各种相关教材上也只是浅显的从一个例子入手,分别介绍和解释说明,网络的情况也与此类似,一问一答的交互方式更显露出知识的零散。

比较法普遍适用于易混的知识点,运用它能够对知识点的认识和理解更全面深刻。

就此,本文运用比较法从以下三个角度全面深入辨析二者。

一、strlen函数和sizeof运算符各自的定义strlen是STRing LENgth (字符串长度)的缩写。

它是测试字符串长度的函数,函数的值为字符串中的实际长度(不包括‟\0‟在内)[1]。

sizeof是求所占内存字节数的一个单目运算符,它求得的值不受存储内容的影响[2]。

例如有以下程序#include<stdio.h>main(){ char s[]=”012xy\08s34f4w2”;printf(“%d ,%d\n”,strlen(s),sizeof(s));}这题的运行结果为5,15解析:字符数组s中的字符为‟0‟,‟1‟,‟2‟,‟x‟,‟y‟,‟\0‟,‟8‟,‟s‟,‟3‟,‟4‟,‟f‟,‟4‟,‟w‟,‟2‟,‟\0‟,strlen统计的是第一个‟\0‟前的字符个数,所以strlen(s)的值为5,而sizeof统计的是字符数组s所占的内存空间,每个字符占一个字节内存空间,共15个字符,所以sizeof(s)的值为15。

如果把上题改成下面这样的,输出结果就完全不同。

字符数组(用sizeof和strlen计算长度的说明)

字符数组(用sizeof和strlen计算长度的说明)

字符数组(⽤sizeof和strlen计算长度的说明)strlen(char[]):计算⼀个字符数组中\0之前的所有字符数量sizeof(char[]):计算字符数组实际占⽤空间长度当我们执⾏以下代码⽚段时char arr[] = "abc";char arr2[] = {'a','b','c'};printf("%s\n", arr);printf("%s\n", arr2);输出结果为:abc abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫虜恄U?当我们在visual studio中跟踪时,会发现arr在字符串最后⾯添加了⼀个'\0',也就是说arr数组的实际长度⽐字⾯长度多了⼀个字节的长度,⽽arr2还是数组的实际长度3。

当我们修改上述代码,在arr2末尾增加⼀个0char arr[] = "abc";char arr2[] = {'a','b','c',0};printf("%s\n", arr);printf("%s\n", arr2);此时运⾏后,结果相同。

由此可以推断,'\0'和0相等,都代表字符串的结束标志,当定义字符串数组时,实际上系统是在字符串字⾯量末尾增加了⼀个'\0',也就是int类型的0。

字符串常量系统会⾃动在结尾增加⼀个字符\0,该结论通过以下语句就更容易理解了printf("%s",sizeof("hello"));输出结果为:6当输出不带0的arr2时,当系统没遇见0时,也就是说没遇见字符串结束标志时,系统就是⼀直打印它后⾯的字符,直到遇见0字符位置为⽌第⼀种情况char arr[3];//定义⼀个数组,并开辟了3个字符空间,但是没有初始化。

C语言strlen()函数用法

C语言strlen()函数用法
博客园 用户登录 代码改变世界 密码登录 短信登录 忘记登录用户名 忘记密码 记住我 登录 第三方登录/注册 没有账户, 立即注册
C语言 strlen()函数用法
C语言 strlen()函数:返回字符串的长度
头文件:#include <string.h>
strlen()函数用来计算字符串的长度,其原型为:unsigned int strlen (char *s); s为指定的字符串
eg:
#incluБайду номын сангаасe<stdio.h> #include<string.h> int main() {
char *str1 = "/cpp/u/shipin/"; char str2[100] = "/cpp/u/shipin_liming/"; char str3[5] = "12345"; printf("strlen(str1)=%d, sizeof(str1)=%d\n", strlen(str1), sizeof(str1)); printf("strlen(str2)=%d, sizeof(str2)=%d\n", strlen(str2), sizeof(str2)); printf("strlen(str3)=%d, sizeof(str3)=%d\n", strlen(str3), sizeof(str3)); return 0; } 运行结果: strlen(str1)=38, sizeof(str1)=4 strlen(str1)=45, sizeof(str1)=100 strlen(str1)=53, sizeof(str1)=5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、数组或字符串的长度
1、sizeof()---求所占的字节数
(1)、对于整型字符型数组
(2)、对于整型或字符型指针
2、strlen()---字符数组或字符串所占的字节数
(1)、针对字符数组
(2)、针对字符指针
3、sizeof()与strlen()区别
4、c++中的字符串string的长度
一、数组或字符串的长度
1、sizeof()---求所占的字节数
(1)、对于整型字符型数组
int A[]={1,4,5,2,8,6,0};
//求整型数组A所占的字节数
int i=sizeof(A); //i表示整型数组A所占的总空间的字节数
cout<<” i=sizeof(A)= ”<<i<<endl;
i=sizeof(A)/sizeof(int); //此时i表示数字数组的元素个数
char B*+=,‘a’,’e’,’s’,’r’,’q’};
//求字符数组的所占的字节数
i=sizeof(B);
cout<<i<<endl; //结果为5*sizeof(char)=5
//求字符数组的元素个数
i=szieof(B)/sizeof(char); //结果为5
char C*+=”abcde”;
i=sizeof(C); //i为字符数组C所占的字节空间,为6,最后一个为’\0’
cout<<i<<endl;
(2)、对于整型或字符型指针
int *p;
int A[]={1,2,3,4,5,6,7,8};
p=A;
inti=sizeof(*p); //此时i就是p所指的整型数组A的第一个元素A[0]的所占字节数 cout<<i<<endl;
i=sizeof(P); // p为整形指针,大小为定值为4
cout<<*p<<endl; //输出A[0]即1
cout<<p<<endl; //输出的结果为整型指针所指向的地址 0x……
char *p;
char B*+=,‘a’,’s’,’e’,’r’-;
p=B; //字符指针赋值,或char *p=B;这样为字符指针初始化赋值
i=sizeof(p); //p为字符指针,指针的大小为定值,为4
cout<<i<<endl;
i=sizeof(*p); //这是指B[0]所占空间的大小
cout<<i<<endl; //结果为1
注意:
cout<<*p<<endl; //输出结果为字符a
cout<<p<<endl;
cout<<hex<<(int)&(*p)<<" "<<&B<<endl; //输出结果两者相同
cout<<hex<<(int)p<<" "<<&B<<endl; //输出结果两者相同
2、strlen()---字符数组或字符串所占的字节数
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

--就是指实际字符串或字符数组的实际长度(不是所占空间的字节数)。

(1)、针对字符数组
char A[6]={'a','b','\0','d','e','r'};
inti=strlen(A); //i为2,因为到’\0’结束,故实际A[]只有2个元素
cout<<i<<endl;
char *str="abcde";
i=strlen(str); //i为5
cout<<i<<endl;
//char A[6]={"abcdef"}; //error C2117: 'abcdef' : array bounds overflow
(2)、针对字符指针
char C[]={"abcdef"};
char *p1=C;
i=strlen(p1); //结果为6
cout<<i<<endl;
char D[]={'a','c','q','f','w'};
i=strlen(D); //这样,由于没指定D的内存分配大小,用strlen求其长度会造成错误。

//如果为char D[5]={'a','c','q','f','w'};这样再用strlen求其长度也会造成错误,当D[]之中的数//大于5才不会造成错误。

cout<<i<<endl;
(3)、针对其他结构
class X
{
inti;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上
解释一下,在class X中,成员中最大的所占的空间为int类型所占的空间4个字节,故内存补齐,最后结果为: ((int)(实际成员所占内存空间的和/4)+1)*4
(4)、有关空类
一个空类占多少空间?多重继承呢?
可以自己编写一个程序简单测一下:
#include <iostream>
using namespace std;
class A
{
};
class A2
{
};
class B:public A
{
};
class C:public virture B
{
};
class D:public A,public A2
{
};
int main()
{
cout<<"sizeof(A): "<<sizoef(A)<<endl;
cout<<"sizeof(B): "<<sizeof(B)<<endl;
cout<<"sizeof(C): "<<sizeof(C)<<endl;
cout<<"sizeof(D): "<<sizeof(D)<<endl;
return 0;
}
结果:1 1 4 1
表明空类所占空间为1个字节,单一继承的空类空间也为1,多重继承的空类空间还是1,但虚继承涉及虚表(虚指针),所以sizeof(C)为4。

3、sizeof()与strlen()区别
sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。

4、c++中的字符串string的长度
string str1=”xxxxx”;
inti=str1.length();
cout<<”i=str1.length()= ”<<i<<endl; //结果为5,因为5个x
i=tr1.size();
cout<<”str1.size()= ”<<i<<endl;
对于c++中的size()和lengt()没有区别,下面是它们的代码
size_type __CLR_OR_THIS_CALL length() const
{ // return length of sequence
return (_Mysize);
}
size_type __CLR_OR_THIS_CALL size() const
{ // return length of sequence
return (_Mysize);
}
为了兼容等,这两个函数一样。

length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法。

string类的size()/length()方法返回的是字节数,不管是否有汉字。

相关文档
最新文档