1. char*、char[] 与 std::string 之间的区别:
char*是一个指向字符的指针,是一个内置类型。可以指向一个字符,也可以表示字符数组的首地址(首字符的地址)。我们更多的时候是用的它的第二的功能,来表示一个字符串,功能与字符串数组char ch[n]一样,表示字符串时,最后有一个 ' '结束符作为字符串的结束标志。
#include <iostream> int main() { char ch1 = 'c'; char ch2[12] = "Hello Wrold"; char* pch1 = "string"; char* pch2 = ch2; char* pch3 = &ch1; char* pch4 = &ch2[2]; std::cout << ch2 << std::endl; // 输出ch2[0]到 之前的所有字符 std::cout << pch1 << std::endl; // 输出ch1[0]到 之前的所有字符 std::cout << pch2 << std::endl; // 输出ch2[0]到 之前的所有字符 std::cout << pch4 << std::endl; // 输出ch2[2]到 之前的所有字符 std::cout << *pch3 << std::endl; // 解引用pch3,输出pch3指向的字符 std::cout << *pch4 << std::endl; // 解引用pch4,输出pch4指向的字符 return 0; }
输出:
Hello Wrold string Hello Wrold llo Wrold c l
char p[], 表示 p 是一个字符串的数组;
std::string s, 表示 s 是一个 std::string 类的对象。
#include <iostream>
int main() { char p1[] = "12345"; char* p2 = "12345"; std::string p3 = "12345"; std::cout << "sizeof(p1) is: " << sizeof(p1) << std::endl; std::cout << "strlen(p1) is: " << strlen(p1) << std::endl; std::cout << "sizeof(p2) is: " << sizeof(p2) << std::endl; std::cout << "strlen(p2) is: " << strlen(p2) << std::endl; std::cout << "sizeof(p3) is: " << sizeof(p3) << std::endl; std::cout << "strlen(p3) is: " << strlen(p3.c_str()) << std::endl; std::cout << "length(p3) is: " << p3.length() << std::endl; std::cout << "capacity(p3) is: " << p3.capacity() << std::endl; return 0; }
输出结果如下:
sizeof(p1) is: 6 strlen(p1) is: 5 sizeof(p2) is: 8 strlen(p2) is: 5 sizeof(p3) is: 24 strlen(p3) is: 5 length(p3) is: 5 capacity(p3) is: 22
p1是 char 型数组名称,sizeof(p1)表示数组的长度(整个数组所占的字节数);
p2是指向 char 类型的指针,sizeof(p2)表示其所指向的地址值所占的字节数;
p3是 std::string 类型的对象,sizeof(p3)是 std::string 类型所占空间的大小,无论赋给它多长的字符串,sizeof(p3)都是固定值28;
strlen函数统计字符串的长度,但不包含结束符’ ’,std::string 类的 length 函数同样是统计字符串长度,std::string 类的 capacity 函数的返回值一定会大于等于字符串的长度,std::string 会预先分配一定的空间,空间不足时会重新分配。
2. char*、char[] 与 std::string 之间的转换
首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。
注意,与char*不同的是,string不一定以NULL(' ')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。
(1)string 转换成 char*
如果要将string直接转换成const char *类型,可以直接赋值,string有2个函数可以运用。一个是.c_str(),一个是data成员函数。
#include <iostream> #include <string> int main() { std::string str = "abcdeg"; const char* k = str.c_str(); const char* t = str.data(); printf("%s%s ", k, t); std::cout << k << t << std::endl; return 0; }
如上,都可以输出。内容是一样的。但是只能转换成const char*,如果去掉const编译不能通过。
那么,如果要转换成char*,可以用string的一个成员函数copy实现。
#include <iostream> #include <string> int main() { std::string str = "abcdefg"; int len = str.length(); char* data = (char *)malloc((len + 1) * sizeof(char)); str.copy(data, len, 0); printf("%s ", data); std::cout << data << std::endl; return 0; }
(2)string 转换成 char[]
不可以直接赋值。可以循环char*字符串逐个字符赋值,也可以使用strcpy_s等函数(需调用string对象的c_str函数,返回类型为const char* )。
这样的转换不可直接赋值。
#include <iostream> #include <string> int main() { std::string str = "dagah"; char ch[8]; int i = 0; for( ; i < str.length(); ++i) { ch[i] = str[i]; } ch[i] = '