strlen(函数)
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
头文件:
格式:strlen (字符数组名)
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NUL。
sizeof(运算符)
学过数据结构的你应该知道 指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部 地址总线的宽度。所以在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个字节)
(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) |
|
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.执行语句
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
首先说明一点,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位十六进制所代表的任意字符 | 二位十六进制 |
注意:区分,斜杠:"/" 与 反斜杠:"\" ,此处不可互换