在做题的时候经常遇到string, char*,char[ ]之间的转换,而且很容易记混导致程序出错。是时候把这三者的转换方法整理出来了!
直达车:
一、char[ ] 转 char* 。
可以直接赋值。
char c[11];
char *cp = NULL;
cin>>c;
cp = c; \\直接赋值
cout<<cp<<endl;
二、char[ ] 转 string。
同样可以直接赋值。
char c[11];
string str;
cin>>c;
str = c; \\直接赋值
cout<<str<<endl;
三、char* 转 char[ ]。
首先保证char*指向有效内存,然后使用strcpy()对char[ ]赋值。
char c[11],t[11];
char *cp=NULL;
cin>>t;
cp = t; //指向有效内存
strcpy(c,cp);
cout<<c<<endl;
四、char* 转 string。
首先保证char*指向有效内存,然后直接赋值。
char t[11];
char *cp=NULL;
string str;
cin>>t;
cp = t; //指向有效内存
str = cp;
cout<<str<<endl;
五、string 转 char[ ]。
通过string.length()获得字符串长度,然后老老实实一个个赋值。
string str;
char c[11];
cin>>str;
for(int i=0;i<str.length();i++){
c[i] = str[i];
}
c[i]='\0'; \\记得添加字符串结尾符!
cout<<c<<endl;
六、string 转 char*。
使用string类中提取C串的成员函数:c_str(), data() 或 copy()可以实现。
首先简单介绍一下这3个函数(如果你很着急,也可以不用看~):
函数原型 | 功能 |
---|---|
unsigned copy (char * s, unsigned n, unsigned pos = 0) const; | 将string对象从pos开始的n个字符复制给字符串s,返回字符数 |
const char * c_str( ) const; | 返回指针,指向string类对象中的字符串,末尾加上’\0’ |
const char * data( ) const; | 返回指针,指向string类对象中的字符串 |
1 使用c_str()方法:
string str;
char *cp = NULL;
cin>>str;
cp = (char*)str.c_str();
cout<<cp<<endl;
c_str()返回const char*类型,所以需要强制转换为char * 。当然,也可以直接定义 const char* cp;
。
2 使用data()方法:
string str;
char *cp = NULL;
cin>>str;
cp = (char *)str.data();
cout<<cp<<endl;
同上,需要强制转换为char *,或者直接将cp定义为指针常量。
3 使用copy()方法:
string str;
char *cp = NULL;
cin>>str;
int length = str.length()+1;
cp = new char[length];
str.copy(cp,length,0);
cp[length]='\0'; //添加字符串结尾符!!!
cout<<cp<<endl;
附:示例代码
#include <iostream>
#include <string>
using namespace std;
int main(){
/*-----------------------------PART ONE------------------------------------*/
char c1[11];
char *cp1=NULL;
string str1;
cout<<"Please input a c[] (length limited 10):"<<endl;
cin>>c1;
//char[] to char*: 直接赋值
cp1 = c1;
cout<<"1. Convert char[] to char*: "<<endl;
cout<<cp1<<endl;
//char[] to string: 直接赋值
str1 = c1;
cout<<"2. Convert char[] to string: "<<endl;
cout<<str1<<endl;
/*-----------------------------PART TWO------------------------------------*/
char c2[11],t[11];
char *cp2=NULL;
string str2;
cout<<"Please input a c[] (length limited 10):"<<endl;
cin>>t;
//char* to char[]:首先保证char*指向有效内存,然后使用strcpy()对char[]赋值
cp2=t; //指向有效内存
strcpy(c2,cp2);
cout<<"3. Convert char* to char[]: "<<endl;
cout<<c2<<endl;
//char* to string:首先保证char*指向有效内存,然后直接赋值
str2=cp2;
cout<<"4. Convert char* to string: "<<endl;
cout<<str2<<endl;
/*----------------------------PART THREE-----------------------------------*/
char c3[11];
char *cp3=NULL;
string str3;
cout<<"Please input a string (length limited 10):"<<endl;
cin>>str3;
//string to char[]:老老实实一个个赋值
for(int i=0;i<str3.length();i++){
c3[i]=str3[i];
}
c3[i]='\0';
cout<<"5. Convert string to char[]: "<<endl;
cout<<c3<<endl;
//string to char*:使用string类中提取C串的成员函数(c_str(), data() or copy())
//使用string::c_str()
cout<<"6_1. Convert string to char* by using string::c_str():"<<endl;
cp3 = (char *)str3.c_str();
cout<<cp3<<endl;
//使用string::data()
cp3 = (char *)str3.data();
cout<<"6_2. Convert string to char* by using string::data():"<<endl;
cout<<cp3<<endl;
//使用string::copy()
int length = str3.length()+1;
cp3 = new char[length];
str3.copy(cp3,length,0);
cp3[length]='\0'; //添加字符串结尾符
cout<<"6_3. Convert string to char* by using string::copy():"<<endl;
cout<<cp3<<endl;
return 0;
}
运行结果: