“字符串长度的计算”+“strlen()和sizeof()的区别”

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)一个转义字符总是以反斜杠开始,再加一个其他字符组成;

 

不带转义字符

带转义字符

 

字符

“ab-e=!\”

"abc\n"

“abc\n\\\’\”

“abc \0xyz”

“abc \\0xy”

“abc\\\0xy”

“abc \\\061xy”

 

长度

7

4

7

3

7

4

7

 

解释

 

'\n'为转义字符(换行符),计算字符串长度时只 能计作一个字符,所以该字符串的长度为 4(而不是 5)

有 4个转义字符:'\n'(换行符) 、 '\\'(反斜杠) 、 '\''(单引号)、 '\"'(双引号),所以该字符串的长度为 7(而不是 11)。

有一个转义字符 '\0', 它是字符串结束符, 所以, 当用函数 strlen 来测试该字符串的长度时,结果应该为 3(而不是 7)。

有一个转义字符 '\\'(反斜杠),这样,后面的字 符串 “0xy” 照样计算,所以,该字符串的长度为 7(而不是将第二个反斜杠与其 后的 0结合为一个转义字符 '\0',若那样的话,第一个反斜杠将无法处理,因为一 个转义字符总是由反斜杠加其他字符组成的, 单独的一个反斜杠不能作为任何合 法的字符)

有二个转义字符 '\\'(反斜杠) 和 '\0'(字符串结束符),这时,当用函数 strlen 来测试该字符串的长度时,结果 应该为 4(而不是 7)。

有二个转义字符 '\\'(反斜 杠)和 '\061'(ASCII 码值等于 061的字符,也即数字字符 '1' ),这时,当用函数 strlen 来测试该字符串的长度时,结果应该为 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,在C/C++中一个指针占4个字节

str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的总空间,所以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计入字符串的长度的。

所有的转义字符和所对应的意义:

转义字符意义ASCII码值(十进制
\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位十六进制所代表的任意字符二位十六进制

注意:区分,斜杠:"/" 与 反斜杠:"\" ,此处不可互换

  • 22
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值