“字符串长度的计算”+“strlen()和sizeof()的区别”
不带转
义字符
带转义字符
字符“ab-
e=!\”
"abc\n"“abc\n\\\’\”“abc \0xyz”“abc \\0xy”“abc\\\0xy”“abc \\\061xy”
7473747
解释'\n'为转
义字符
(换⾏
符),计算
字符串
有 4个转义字
符:'\n'(换⾏符) 、
'\\'(反斜杠) 、
'\''(单引号)、
'\"'(双引号),所以
有⼀个转义字
符 '\0', 它是字
符串结束符, 所
以, 当⽤函
数 strlen 来测
有⼀个转义字
符 '\\'(反斜杠),
这样,后⾯的字 符
串 “0xy” 照样
计算,所以,该字符
有⼆个转义字
符 '\\'(反斜
sizeof 指针杠) 和 '\0'(字符
串结束符),这时,
当⽤函
有⼆个转义字符 '\\'(反斜 杠)
和 '\061'(ASCII 码值等于 061
的字符,也即数字字符 '1' ),这时,
当⽤函数 strlen 来测试该字符
串的长度时,结果应该为 7(⽽不
strlen(函数)
strlen所作的仅仅是⼀个计数器的⼯作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚⾄是某个不确定的内存区域)开始扫描,直到碰到第⼀个字符串结束符'\0'为⽌,然后返回计数器值(长度不包含'\0')。
头⽂件
头⽂件:string.h
格式:strlen (字符数组名)
功能
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
说明
说明:返回s的长度,不包括结束符NUL。
sizeof(运算符)
sizeof是C/C++中的⼀个操作符(operator),简单的说其作⽤就是返回⼀个对象或者类型所占的内存字节数。
学过数据结构的你应该知道 指针是⼀个很重要的概念,它记录了另⼀个对象的地址。既然是来存放地址的,那么它当然等于计算机内部 地址总线的宽度。所以在32位计算机中,⼀个 指针变量的返回值必定是4(注意结果是以 字节为单位),但是,在 64位系统中指针变量的sizeof结果为8。
数组的sizeof值等于数组所占⽤的内存字节数,如:  char a1[] = "abc"; int a2[3];
sizeof( a1 ); // 结果为4,字符末尾还存在⼀个NULL终⽌符
sizeof( a2 ); // 结果为3*4=12(依赖于int)
(char占1个字节,int占4个字节)
C 语⾔——字符串长度的计算⽅法
提⽰:(1)计算字符串长度时关键是要注意辨认转义字符;
(2)⼀个转义字符总是以反斜杠开始,再加⼀个其他字符组成;
字符串长度时只 能计作⼀个字符,所以该字符串的长度
为 4(⽽不是 5) '\"'(双引号),所以
该字符串的长度
为 7(⽽不
是 11)。
数 strlen 来测
试该字符串的
长度时,结果应
该为 3(⽽不
是 7)。
计算,所以,该字符
串的长度为 7(⽽
不是将第⼆个反
斜杠与其 后的 0
结合为⼀个转义
字符 '\0',若那样
的话,第⼀个反斜
杠将⽆法处理,因
为⼀ 个转义字符
总是由反斜杠加
其他字符组成
的, 单独的⼀个反
斜杠不能作为任
何合 法的字符)
当⽤函
数 strlen 来测
试该字符串的长
度时,结果 应该
为 4(⽽不
是 7)。
串的长度时,结果应该为 7(⽽不
是 4或 9)。所以,当遇到 转义字
符 '\0'时,还要看其后⾯是否还有
数字,若有,则应将后⾯的数字(⼀
⾄ ⼆位)与前⾯的 '\0'相结合作
为⼀个字符计⼊整个字符串的长
度。***(若
⽤ printf(“abc \\\061xy”) ;
输出,则输出结果为:abc\1xy)
例:
1.请选出以下语句的输出结果()
printf("%d\n",strlen("\t\"\065\xff\n"));
(A) 5  (B) 14    (C) 8      (D) 输出项不合法,⽆正常输出
正确答案是 (A):字符串中包含的 5个字符是:'\t'(跳格符) 、 '\"'(双引号) 、 '\065' (ASCII 值为⼋进制 065, 也即⼗进制为 51的字符) 、
'\xff'(ASCII 值为⼗六进制 ff ,也即⼗进制为 255的字符)、 '\n'(换⾏符)。
2.若有以下程序段:
charstr[]="ab\n\012\\\"";
printf("%d",strlen(str));
上⾯程序段的输出结果是
A) 3      B) 4      C) 6      D) 12
正确答案是(C):字符串中包含的6个字符是:'a'、'b'、'\n'、'\012'、'\\'和'\"'。
3.执⾏语句
char s[]="ab\0234\\\n79";
cout<<strlen(s)<<','<<sizeof(s)的输出是:
A).8,9      B)9,9      C).11,10    D).14,15
正确答案:A
ab两个;  \023⼀个;  4⼀个;  \\⼀个;  \n⼀个;  79两个,共8个。strlen(s) 是8;      sizeof(s) 还要包括最后的'\0', 所以是9。***\023是被\转义的ASCII码,ASCII码⼗进制表⽰只有三位数字,如果是⼗六进制表⽰\x17
4.(摘⾃百度知道)
已知 char *str1="absde"; char str2[]="absde"; char str3[8]={'a',}; char ss[] = "0123456789";为什么sizeof(str1)=4sizeof(str2)=6;sizeof(str3)=8;sizeof(ss)=11;
⾸先说明⼀点,char类型占⼀个字节,所以sizeof(char)是1,这点要理解
str1是⼀个指针,只是指向了字符串"absde"⽽已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,⽽是⼀个字符型指针占的空间。所以sizeof(str1)=sizeof(char*)=4,在中⼀个指针占4个字节
str2是⼀个字符型数组。规定,对于⼀个数组,返回这个数组占的总空间,所以sizeof(str2)取得的是字符串"absde"占的总空间。"absde"中,共有a b s d e \0六个字符,所以str2数组的长度是6,所以sizeof(str2)=6*sizeof(char)=6
str3已经定义成了长度是8的数组,所以sizeof(str3)为8
str4和str2类似,'0' '1' ... '9'加上'\0'共11个字符,所以ss占的空间是8
总之,对于指针,sizeof操作符返回这个指针占的空间,⼀般是4个字节;⽽对于⼀个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,⼀定要分清,⽽且char*="aaa"的写法现在不被提倡,应予以避免
⽽strlen不区分是数组还是指针,就读到\0为⽌返回长度。⽽且strlen是不把\0计⼊字符串的长度的。
所有的转义字符和所对应的意义:
转义字符意义值()
\a响铃(BEL)007
\b退格(BS) ,将当前位置移到前⼀列008
\f换页(FF),将当前位置移到下页开头012
\n换⾏(LF) ,将当前位置移到下⼀⾏开头010
\r回车(CR) ,将当前位置移到本⾏开头013
\t⽔平制表(HT) (跳到下⼀个TAB位置)009
\v垂直制表(VT)011
\\代表⼀个反斜线字符''\'092
\'代表⼀个(撇号)字符039
\"代表⼀个字符034
\?代表⼀个问号063
\0空字符(NULL)000
\ooo1到3位⼋进制数所代表的任意字符三位
\xhh1到2位⼗六进制所代表的任意字符⼆位⼗六进制
注意:区分,:"/" 与:"\" ,此处不可互换

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。