电话18065871965

邮箱qidianxingcheng@163.com

地址三明市三元区乾龙新村69幢B座2楼

C++ | char*,char[], string的相互转换

2022年11月14日 1,028

 在用C++刷题的过程中,经常遇到char*、char[]和string之间转换的小问题,每次可能都需要搜一下怎么转换。所以这次做一个完整的总结。

 这三个类型之间的转换方法希望你看起来不头晕。

1. char[] 转 char*

直接利用赋值转换

char ch[]="abcdef";
char *s = ch;
cout << s << endl; // 这不是打印地址,而是打印s的内容

2. char* 转 char[]

(1)借助strncpy()(比strcpy()更安全)
char* s=(char *)"abcdef";// char指针不能直接赋字符串,因为字符串是const char *的
char ch[100];
strncpy(ch,s,7);
这里有一个小问题,char*需要加const修饰,否则存在间接地址修改常量的风险。所以下面这么写是有问题的,编译器会报错。

char* s = "abcdef"
要么用上面的方式,要么用下面这种:

const char * s= "abcdef";

(2)循环按位赋值
    注意给最后补上'\0'结束符:

char ch[100];
char* s = (char *)"abcdef";
int i = 0;
while (*s != '\0')
{
  ch[i++] = *s++;
}
ch[i] = '\0';
cout << ch << endl;

3.string转char[]

string的单独字符s[i]取出来就是char类型的,可以直接赋值。此外,还要注意最后给char数组附上'\0'结束符。

string s = "abcdef";
char ch[10];
int i = 0;
for (i; i < s.size(); i++)
{
ch[i] = s[i];
}
ch[i] = '0';

4. char[] 转 string

直接赋值

string s;
char ch[10] = "abcdef";
s = ch;

5. string 转 char*


(1)c_str()

c_str()函数返回一个以’\0’结尾的字符数组。

注意c_str()返回的是一个const char *类型的数组。

string s = "abcdef";
char* ch;
ch = (char *)s.c_str();

(2)data()

data()仅返回字符串内容,而不含有结束符'\0'.

string s = "abcdef";
char* ch;
s += '\0';
ch = (char *)s.data();

(3)copy()

函数原型:

str1.copy(str2,len,pos);
函数作用:str1 和 str2 是两个字符串对象,len 是子字符串的长度。Copy()函数就是将字符串 str1 复制到字符串对象 str2,pos表示确定要包含的第一个字符的位置,默认为0.

而这个str2就可以是char*的类型,所以用法如下。注意提前给char *变量初始化内存空间:

string s = "abcdef";
s += '\0';
char* ch = new char[s.length()];
s.copy(ch, s.length());
cout << ch << endl;


6.char*转string

(1)直接赋值
string s;
char* ch = (char *)"abcdef";
s = ch;

(2)assign()
函数原型:

str1.assign ( const string& str2, size_t pos, size_t n );
函数作用:将str2的内容从位置pos起的n个字符作为原字串的新内容赋给原字串str1,pos默认为0,n默认为新内容str的长度。

string s;
char* ch = (char *)"abcdef";
s = ch;
s.assign(ch);