文章目录 22. 字符串 22.1. 字符数组 vs 字符指针 vs 常量字符指针 vs string 22.2. strcpy vs sprintf vs memcpy 22.3. strlen vs length vs size vs sizeof 22.4. 字符串之间的转换 22.5 其他数据类型与字符串之间的转换 22.6 字符串分割
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 字符串分割
int main ( ) { char str[ ] = "apple,banana,orange,grape" ; char * token = strtok ( str, "," ) ; while ( token != nullptr ) { printf ( "%s\n" , token) ; token = strtok ( NULL , "," ) ; } return 0 ;
}