C语言中sizeof与strlen区别

合集下载

C语言关键字详解

C语言关键字详解

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和sizeof的区别

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长度

字符串的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语言字符串替换:字符,字符串,字符数组详解

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'结尾。

sizeof与strlen的区别

sizeof与strlen的区别

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和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++获取字符串长度的⼏个函数⽅式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的区别与联系

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sizeof(函数名() )
sizeof 也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会 被调用,举例来说定义如下函数: int myprint() { printf(“hello\n”) ; return 0; } int main() { printf(“%d”,sizeof(mypaint())); return 0; } 结果只打印函数返回类型的 sizeof 值, 并没有打印 hello 说明函数 myprint 并没有 调用。 C99 标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被 计算 sizeof 值,即下面这些写法都是错误的: 如:sizeof(myprint) (注意 sizeof(myprint()是可以的) ) 或者 sizeof 一个 void 返回类型的函数如: void foo () { } sizeof( foo () ); 以及位域: struct S { unsigned int f1 : 1; unsigned int f2 : 5; unsigned int f3 : 12; }; sizeof( S.f1 ); 2.strlen strlen 的应用则不像 sizeof 那么广泛,strlen 的参数必须是 char *的指针,如果用 strlen 计算数据类型 strlen(int)这种用法是错误的。strlen 的计算必须依赖字符 序列中的’\0’ 字符, strlen 就是通过判断是否遇到 ’\0’ 来判断字符序列是否结束 的。 它的计算原理类似于下面的两条语句 while(*p!=’\0’) length++
C语言中sizeof与strlen区别
一.本质区别 sizeof 和 strlen 有本质上的区别。sizeof 是 C 语言的一种单目运算符,如++、-等, 并不是函数, sizeof 的优先级为 2 级, 比/、 % 等 3 级运算符优先级高, sizeof 以字节的形式给出操作数的存储空间的大小。而 strlen 是一个函数,是由 C 语言 的标准库提供的。strlen 计算的 是字符串的长度。 二.使用区别 1.sizeof sizeof 的操作数可以是数据类型、函数、变量,表达式使用方式为: (1)数据类型 sizeof (type) 例如我们要计算一个 int 型数据的存储空间可以用: sizeof(int) 。需要注意的是 sizeof 的操作数是数据类型时要加括号。其数值大小为该数据类型所占的存储空 间的字节数。 (2)变量 sizeof(变量名) 如果定义 int a ,可以使用 sizeof (a)计算 a 变量占据的存储空间。具体大小 与 a 的类型有关。 注意:由于 sizeof 是操作符 sizeof a 或 sizeof (a)都可以。 (可以不使用括号) , 如果操作数是数组名则给出数组所占用内存的字节数。 如果数组名做函数的参数 传递时退化为指针。 (3)表达式 sizeof (表达式) sizeof 可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小, 一般不会对表达式进行计算。例如:sizeof(1+1.5) (4)函数调用
strlen 的用法:分为以下几种参数 (1)char * 指针 strlen(指针名) 如果参数是指针则计算该指针指向字符序列的长度。 (以’\0’作为判断标志) 例如: 定义 char *p=“hello world”;strlen(p)=11,而 sizeof (p)=4。可以看到 strlen 计算的是指针指向的字符串的长度而 sizeof 计算的是指针本身所占用的内存空 间的大小。 (2)数组 strlen(数组名) 如果参数是数组的话,实际传递的是一个指针,strlen 会按照上面处理指针的模 式处理该数组。 我们可以看下面的例子: char a[]=”hh”; strlen(a); 很显然 strlen 的结果是 2。但是如果数组是这样赋值的呢? char a[]={‘h’,’h’}; strlen(a); 那么现在 strlen(a)的结果又是多少呢?这个数就不一定了,原因是 strlen 会去 计算 a 地址开始的字符串的长度, 由于前一种赋值方式会将 hh 以字 符串的形式 赋值给数组会将字符串结束符’\0’一同赋值,这时 strlen 就会检查到结束符停止 计算,而第二种复值方式是以单个字符的形式赋值没有结束 符’\0’,这时我们用 sizeof 得到的结果是正常的,而用 strlen 由于找不到结束符,会继续的计算直到 找到结束符为止。所以这个数
相关文档
最新文档