获取CC++字符串、字符数组长度
在C/C++中常⽤的获取字符串长度或者字符串数组长度的函数有
sizeof()
length()
strlen()
size()
其中strlen(str)和str.length()和str.size()都可以⽤来求字符串的长度
str.length()和str.size()是⽤于求string类对象的成员函数
strlen(str) 是⽤于求字符串数组的长度,其参数是char*
辨析strlen() 与 sizeof() 的区别
strlen(char*)
函数求是字符串的实际长度,它可以⽤来获取动态实际字符数组的长度,是从开始到遇到第⼀个“\0”,如果只是定义没有赋予初始值,这个结果是不确定的,它会从数组的⾸地址开始⼀直下去,直到遇到“\0”停⽌查。
sizeof()
求所占总空间的字节数,静态的,跟初始状态字符数组的⼤⼩有关系,⼤⼩等于初始时字符数组的⼤⼩或者等于初始时字符数组的⼤⼩+1 在C++中,如果定义的是字符串数组的话,那么如果想获取数组的长度,只能⽤sizeof(数组名),⽽不能⽤strlen(str)
example
char str[20]="0123456789";
int a=strlen(str); /*a=10;strlen计算字符串的长度,以\0'为字符串结束标记。
int b=sizeof(str); /*b=20;sizeof计算的则是分配的数组str[20] 所占的内存空间的⼤⼩,不受⾥⾯存储的内容影响
char *str1="absde";
char str2[]="absde";
char str3[8]={'a',};
char ss[] = "0123456789";
输出:
sizeof(str1)=4;
sizeof(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计⼊字符串的长度的。
⼀、sizeof
sizeof(...)是运算符,在头⽂件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
由于在编译时计算,因此sizeof不能⽤来返回动态分配的内存空间的⼤⼩。实际上,⽤sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体⽽⾔,当参数分别如下时,sizeof返回的值表⽰的含义如下:
数组——编译时分配的数组空间⼤⼩;
指针——存储该指针所⽤的空间⼤⼩(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间⼤⼩;
对象——对象的实际占⽤空间⼤⼩;
函数——函数的返回类型所占的空间⼤⼩。函数的返回类型不能是void。
⼆、strlen
strlen(...)是函数,要在运⾏时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传⼊时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是⾃⼰定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第⼀个地址开始遍历,直到遇到结束符NULL。返回的长度⼤⼩不包括NULL。
三、举例:
eg1、char arr[10] = "What?";
int len_one = strlen(arr);
int len_two = sizeof(arr);
cout << len_one << " and " << len_two << endl;
输出结果为:5 and 10
点评:sizeof返回定义arr数组时,编译器为其分配的数组空间⼤⼩,不关⼼⾥⾯存了多少数据。strlen只关⼼存储的数据内容,不关⼼空间的⼤⼩和类型。
eg2、char * parr = new char[10];
int len_one = strlen(parr);
int len_two = sizeof(parr);
int len_three = sizeof(*parr);
cout << len_one << " and " << len_two << " and " << len_three << endl;
输出结果:23 and 4 and 1
点评:第⼀个输出结果23实际上每次运⾏可能不⼀样,这取决于parr⾥⾯存了什么(从parr[0]开始知道遇到第⼀个NULL结束);第⼆个结果实际上本意是想计算parr所指向的动态内存空间的⼤⼩,但是事与愿违,sizeof认为parr是个字符指针,因此返回的是该指针所占的空间(指针的存储⽤的是长整型,所以为4);第三个结果,由于*parr所代表的是parr所指的地址空间存放的字符,所以长度为1。
string 类的常见应⽤
C++使⽤内置的数据类型string来处理字符串会很⽅便,可以完全代替C语⾔中的char数组和char指针。
使⽤string类需要包含头⽂件string,同时string 类型的变量结尾没有“\0”,其本质是⼀个string类,因此可以通过调⽤string类中成员函数length()函数,如:
string s = "hello world";
int len = s.lenght();
cout<<len<<endl;
运⾏结果为:11
由于string变量的末尾没有“\0”字符,所以length()返回的是字符串的真实长度,⽽不是长度+1
在C++中可以⽤string类来代替C中的char数组形式的字符串,但是有些情况下是需要转换成C语⾔风格的,如以下代码:
#include <stdio.h>
#include <math.h>
#define MAX 51
int main(){
char s1 [MAX];
char s2 [MAX];
scanf("%s%s",s1,s2);
int len = strlen(s1);
for (int i=0;i<len;i++){
if(s1[i]==s2[i])
printf("1");
else
printf("0");
}
printf("\n");
return0;
}
这⾥需要⼀个个的访问实际数组中的元素,当时如果利⽤C++中的sizeof函数时,获取的是数组的固定空间,⽽不是实际的动态空间。所以这⾥只能⽤strlen(str)来获取char数组的实际长度(也即是⽤户输⼊的字符串的长度),如果⽤sizeof(str)所得到的长度⼤⼩为51。
string类型的字符串转换成char数组字符串
string filename = "";
ifstream in ;
in.open(filename.c_str());
为了使⽤⽂件打开函数,必须将string类型的变量转换为字符串数组
#ifndef _ITERATOR_DEBUG_LEVEL
#define _ITERATOR_DEBUG_LEVEL 0
#else
#undef _ITERATOR_DEBUG_LEVEL
#define _ITERATOR_DEBUG_LEVEL 0
#endif
#include <iostream>
#include <string>
//string字符串->c字符串转换
void main()
{
//string -> char*
string s1 = "far away";
const char* c = s1.c_str();
printf("%s\n",c);
//
string s2 = c;
//string->char[]
//从string中赋值字符到char[]
char arr[50] = {0};
cout << arr << endl;
system("pause");
}
请按任意键继续…
string字符串的输⼊输出
string类重载了输⼊输出的运算符,⽤”>>”进⾏输⼊,⽤”<<”进⾏输出
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;  //输⼊字符串
cout << s << endl;  //输出字符串
system("pause");
return0;
}
运⾏结果:
c plus
c
请按任意键继续…
虽然我们输⼊了两个由空格隔开的”c plus’,但是只输出了⼀个,这是因为输⼊的运算符“>>”默认会忽略空格,遇到空格就认为输⼊结束,所以最后输⼊的plus没有被存储到变量⾥⾯。
访问字符串中得字符
string 字符串也可以像字符串数组⼀样按照下标来访问其中的每⼀个字符。string 字符串的起始下标仍是从 0 开始。请看下⾯的代码:
#include <string>
using namespace std;
//string遍历
void main(){
string s1 = "abcdefg";
//1、数组⽅式c++string类型
cout << "数组⽅式:" << endl;
for (int i = 0; i < s1.length(); i++){
cout <<s1[i] << endl;
}
//2、迭代⽅式
cout << "迭代⽅式:" << endl;
for (string::iterator it = s1.begin(); it != s1.end(); it++){
cout<<*it<< endl;
}
system("pause");
}
b
c
d
e
f
g
迭代⽅式:
a
b
c
d
e
f
g
请按任意键继续…
字符串的拼接
有了string 类,我们可以使⽤”+“ 或者”+=“运算符来直接拼接字符串,⾮常⽅便,再也不需要使⽤C语⾔中的strcat(),strcopy(),malloc()等函数来拼接字符串了,再也不⽤担⼼空间不够溢出了。
下⾯来看列⼦:
//字符串拼接
void main()
{
string s1 = "alan";
string s2 = "xiho";
//1.
string s3 = s1 + s2;
string s4 = " wahaha";
//2.
s3.append(s4);
cout << s3 << endl;
system("pause");
}
输出结果为:
alanxiho wahaha
请按任意键继续…
四、参考资料:
Sizeof与Strlen的区别与联系(转)
1.sizeof操作符的结果类型是size_t,它在头⽂件中typedef为unsigned int类型。
该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
2.sizeof是算符,strlen是函数。

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