“字符串长度的计算”+“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<

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
\ooo 1到3位八进制数所代表的任意字符 三位八进制
\xhh 1到2位十六进制所代表的任意字符 二位十六进制

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

你可能感兴趣的:(概念总结,概念,字符串长度的计算,strlen,sizeof)