在用C++刷题的过程中,经常遇到char*、char[]和string之间转换的小问题,每次可能都需要搜一下怎么转换。所以这次做一个完整的总结。
这三个类型之间的转换方法希望你看起来不头晕。
直接利用赋值转换
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);