22. 字符串
22.1. 字符数组 vs 字符指针 vs 常量字符指针 vs string
字符数组 char[]
它将常量字符拷贝到自己的内存空间,再进行读写操作。 它的大小在编译时确定,且固定大小。 字符指针 char*
它指向常量字符的内存空间,不能修改字符串。 只有为它动态分配内存,才能修改。 常量字符指针 const char*
指向常量字符的指针,不能修改字符串内容。 【注意】 如果是 char* 或 char[] 隐式转换成 const char* ,只是不能通过const char* 去修改,可能存在安全隐患 。示例如下。 string 是C++标准字符串类,封装了字符串的操作和管理。
int main ( ) {
char c1[ ] = "hello" ;
c1[ 0 ] = 'a' ;
char * p1 = "hello" ;
p1[ 0 ] = 'a' ;
char * p2 = new char [ 10 ] ;
strcpy ( p2, "hello" ) ;
p2[ 0 ] = 'a' ;
const char * c = p2;
c[ 0 ] = 'b' ;
p2[ 0 ] = 'b' ;
cout << c << endl;
cout << p2 << endl;
delete [ ] p2;
return 0 ;
}
22.2. strcpy vs sprintf vs memcpy
相同:都可以拷贝。 区别
strcpy是字符串之间的拷贝。 sprintf是其他数据类型到字符串的转化。 memcpy是内存块间的拷贝。 另外,执行效率,memcpy > strcpy > sprintf。示例如下。
struct Person
{
char name[ 20 ] ;
int age;
} ;
int main ( ) {
char data[ 100 ] ;
strcpy ( data, "hello" ) ;
int num = 1234 ;
sprintf ( data, "%d" , num) ;
Person person = { "John" , 30 } ;
memcpy ( data, & person, sizeof ( Person) ) ;
return 0 ;
}
22.3. strlen vs length vs size vs sizeof
相同:都是获取大小。 区别
strlen位于头文件 < cstring >,获取const char* 长度,包括 char*,char[],因为它们可以隐式转换成const char*。 length获取string长度。 size除了获取string长度,还可以获取容器长度。 sizeof获取对象或类型大小,以字节为单位。示例如下。
int main ( ) {
const char * ctr = "Hello" ;
cout << strlen ( ctr) << endl;
cout << sizeof ( ctr) << endl;
string str = "Hello" ;
cout << str. length ( ) << endl;
cout << str. size ( ) << endl;
return 0 ;
}
22.4. 字符串之间的转换
string 转 const char*,使用c_str()。 const char* 转 char[],使用strcpy()。 string 转 char[],使用strcpy(c_str())。 const char*,char*, char[] 转 string,直接赋值。 char*, char[] 转 const char*,隐式转换。
22.5 其他数据类型与字符串之间的转换
const char* 转 int、long和double,分别使用atoi、atol、atof。 string 转 int、long、long long、float、double、long double,分别使用stoi、stol、stoll、stof、stod、stold。 数值类型 转 string,使用to_string。
22.6 字符串分割
使用 , 分割字符串,示例如下。 方法1,strtok 方法2,istringstream
# include <iostream>
# include <sstream>
using namespace std;
int main ( )
{
char str[ ] = "apple,banana,orange,grape" ;
istringstream iss ( str) ;
string token;
while ( getline ( iss, token, ',' ) )
{
cout << token << endl;
}
return 0 ;
}