目录
C++ string、char 、char[]、const char
C++ 字符串与字符数组
ref :
在C++中,有两种类型的字符串表示形式:
- C-风格字符串
C++引入的string类
C-风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。 下面的声明和初始化创建了一个 “Hello” 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 “Hello” 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 ‘\0’ 放在字符串的末尾。所以也可以利用下面的形式进行初始化
char greeting[] = "Hello";
C++ 中的 String 类
C++中的字符串一般有以下四种类型
- string
- char*
- const char*
char[]
#### string string是一个C++类库中的一个类,它位于名称空间std中,因此必须使用using编译指令或者std::string来引用它,它较char*的优势是内容可以动态拓展,比如用+号进行字符串的连接是最常用的操作char char 是指向字符串的指针,你可以让它指向一串常量字符串。
#### const char* 指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改。注意区别- char * const [指向字符的静态指针]
const char * [指向静态字符的指针]
char[]
与char*与许多相同点,代表字符数组,可以对应一个字符串,如
char * a="string1";char b[]="string2";
这里a是一个指向char变量的指针,b则是一个char数组(字符数组)。
区别如下:
- char*是变量,值可以改变, char[]是常量,值不能改变! char型数组的名字,也是该数组首元素的地址,是常量
char * 和char[]的初始化操作有着根本区别:
测试代码:char *a="Hello World";char b[]="Hello World";printf("%s, %d\n","Hello World", "Hello World");printf("%s, %d %d\n", a, a, &a);printf("%s, %d %d\n", b, b, &b);
结果:
Hello World,13457308 Hello World,13457308 2030316 Hello World,2030316 2030316
char * a=”string1”;是实现了3个操作: - 声明一个char*变量(栈区)(也就是声明了一个指向char的指针变量);
- 在内存中的文字常量区中开辟了一个空间存储字符串常量”string1”
- 返回这个区域的地址,作为值,赋给这个字符指针变量a
char b[]=”string2”;则是实现了2个操作:
- 声明一个char 的数组
- 为该数组“赋值”,即将”string2”的每一个字符分别赋值给数组的每一个元素 最终的结果:“数组的值”(注意不是b的值)等于”string2”,而不是b指向一个字符串常量
实际上, char * a=”string1”; 的写法是不规范的!
因为a指向了即字符常量,一旦strcpy(a,”string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的! 应当按照”类型相同赋值”的原则来写代码:const char * a="string1";
const char* 与 char[]的区别:
const char * a=”string1”char b[]=”string2”;
二者的区别在于:
a是const char 类型, b是char const类型 。 ( 或者理解为 (const char)xx 和 char (const xx) ) 作为函数的声明的参数的时候,char []是被当做char *来处理的!两种形参声明写法完全等效! 另外作为函数的形式参数,两种写法完全等效的!都是指针变量!string char* char[] const char* 转化概览
总结方法:
- 变成string,直接赋值。
- char[]变成别的,直接赋值。
- char*变constchar*容易,const char*变char*麻烦。
<const_cast><char*>(constchar*);
- string变char*要通过const char*中转。
- 变成char[]。string逐个赋值,char* const char* strncpy_s()。
代码示例
1、string转为其他类型
①、string转const char*
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ std::string str = "HelloWorld!"; //初始化string类型,并具体赋值 const char* constc = nullptr; //初始化const char*类型,并赋值为空 constc= str.c_str(); //string类型转const char*类型 printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str() printf_s("%s\n", constc); //打印const char*类型数据 return 0;}
②、string转char*
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ std::string str = "HelloWorld!"; //初始化string类型,并具体赋值 char* c = nullptr; //初始化char*类型,并赋值为空 const char* constc = nullptr; //初始化const char*类型,并赋值为空 constc= str.c_str(); //string类型转const char*类型 c= const_cast (constc); //const char*类型转char*类型 printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str() printf_s("%s\n",c); //打印char*类型数据 return 0;}
③、string转char[]
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ std::string str = "HelloWorld!"; //初始化string类型,并具体赋值 char arrc[20] = {0}; //初始化char[]类型,并赋值为空 for (int i = 0; i < str.length(); i++) //string类型转char[]类型 { arrc[i]=str[i]; } printf_s("%s\n", str.c_str()); //打印string类型数据 .c_str() printf_s("%s\n", arrc); //打印char[]类型数据 return 0;}
2、const char*转为其他类型
①const char*转string
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值 std::string str; //初始化string类型 str= constc; //const char*类型转string类型 printf_s("%s\n", constc); //打印const char* 类型数据 printf_s("%s\n", str.c_str()); //打印string类型数据 return 0;}
②const char*转char*
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值 char* c = nullptr; //初始化char*类型 c= const_cast (constc); //const char*类型转char*类型 printf_s("%s\n", constc); //打印const char* 类型数据 printf_s("%s\n", c); //打印char*类型数据 return 0;}
③const char*转char[]
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ const char* constc = "Hello World!"; //初始化const char* 类型,并具体赋值 char arrc[20] = { 0 }; //初始化char[]类型,并赋值为空 strncpy_s(arrc,constc,20); //const char*类型转char[]类型 printf_s("%s\n", constc); //打印const char* 类型数据 printf_s("%s\n", arrc); //打印char[]类型数据 return 0;}
3、char*转为其他类型
①char*转string
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值 std::string str; //初始化string类型 str= c; //char*类型转string类型 printf_s("%s\n", c); //打印char* 类型数据 printf_s("%s\n", str.c_str()); //打印string类型数据 return 0;}
②char*转const char*
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值 const char* constc = nullptr; //初始化const char* 类型,并具体赋值 constc= c; //char*类型转const char* 类型 printf_s("%s\n", c); //打印char* 类型数据 printf_s("%s\n", constc); //打印const char* 类型数据 return 0;}
③char*转char[]
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ char* c = "HelloWorld!"; //初始化char* 类型,并具体赋值 char arrc[20] = { 0 }; //初始化char[] 类型,并具体赋值 strncpy_s(arrc,c,20); //char*类型转char[] 类型 printf_s("%s\n", c); //打印char* 类型数据 printf_s("%s\n", arrc); //打印char[]类型数据 return 0;}
4、char[]转为其他类型
#include "stdafx.h"#includeint _tmain(intargc, _TCHAR* argv[]){ char arrc[20] = "HelloWorld!";//初始化char[] 类型并具体赋值 std::string str; //初始化string const char* constc = nullptr; //初始化const char* char*c = nullptr; //初始化char* str= arrc; //char[]类型转string类型 constc= arrc; //char[]类型转const char* 类型 c= arrc; //char[]类型转char*类型 printf_s("%s\n", arrc); //打印char[]类型数据 printf_s("%s\n", str.c_str()); //打印string类型数据 printf_s("%s\n", constc); //打印const char* 类型数据 printf_s("%s\n", c); //打印char*类型数据 return 0;}