C++字符串与字符数组详解

前言

转自:C++字符串与字符数组 详解

作者:ZeroZone零域

在C++中,有两种类型的字符串表示形式:

  • C风格字符串
  • C++引入的string类

1. C风格字符串

C风格的字符串起源于C语言,并在C++中继续得到支持。字符串实际上是使用null字符’\0’终止的一维字符数组。因此,一个以null结尾的字符串,包含了组成字符串的字符。

下面示例创建了一个"Hello"字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词"Hello"的字符数多一个。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

其实,不需要把null字符放在字符串常量的末尾。C++编译器会在初始化数组时,自动把’\0’放在字符串的末尾。所以也可以利用下面的形式进行初始化

char greeting[] = "Hello";

以下是C/C++中定义的字符串的内存表示:

在这里插入图片描述

C++中有大量的函数用来操作以null结尾的字符串,如下所示:

序号函数功能
1strcpy(s1,s2)复制字符串s2到字符串s1
2strcat(s1,s2)连接字符串s2到字符串s1的末尾
3strlen(s1)返回字符串s1的长度
4strcmp(s1,s2)返回s1与s2的比较结果
5strchr(s1,ch)返回一个指针,指向字符串s1中字符ch的第一次出现的位置
6strstr(s1,s2)返回一个指针,指向字符串s1中s2的第一次出现的位置

2. C++中的string类

C++标准库提供了string类类型,支持上述所有的操作,另外还增加了其它很多的功能。比如:

序号函数功能
1append()在字符串的末尾添加字符
2find()在字符串中查找字符串
3insert()插入字符
4length()返回字符串的长度
5replace替换字符串
6substr()返回某个子字符串
7
2.1 4种字符串类型

C++中的字符串一般有以下四种类型:

  • string
  • char *
  • const char *
  • char[]

下面分别做简单介绍,并说明其中的一些区别

2.1.1 string

string是C++类库中的一个,它位于命名空间std中,因此必须使用using编译指令或者std::string来引用它。它包含了对字符串的各种常用操作,它较char *的优势是内容可以动态扩展,以及对字符串操作的方便快捷,用+号进行字符串的连接是最常用的操作

2.1.2 char *

char *是指向字符串的指针(其实严格来说,它是指向字符串的首个字母),你可以让它指向一串常量字符串

2.1.3 const char

该声明指出,指针指向的是一个const char类型,即不能通过当前的指针对字符串的内容作出修改,注意这里有两个概念:

  • char * const -> [指向字符的静态指针]
  • const char * -> [指向静态字符的指针]

前者const修饰的是指针,代表不能改变指针

后者const修饰的是char,代表字符不能改变,但是指针可以变,也就是说该指针可以指向其它的const char

2.1.4 char[]

char[]与char *有许多相同点,代表字符数组,可以对应一个字符串,如:

char * a = "Hello";
char b[] = "Hello"

这里a是一个指向char变量的指针,b则是一个char数组(字符数组)。也就是说,二者的不同点如下

  • 1.char *是变量,值可以改变,char[]是常量,值不能改变

    a是一个char型指针变量,其值(指向)可以改变
    b是一个char型数组的名字,也是该数组首元素的地址,是常量,其值不可以改变

  • 2.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, -159495787
    Hello World, -159495787 1900964144
    Hello World, 1900964156 1900964156
    

    char * a = "Hello World"实现了3个操作:

    1.声明了一个char*变量(栈区)(也就是声明了一个指向char的指针变量)
    2.在内存中的文字常量区中开辟了一个空间存储字符串常量"hello"
    3.返回这个区域的地址,作为值,赋给字符指针变量a

    char b[] = "Hello World"实现了2个操作:

    1.声明了一个char数组
    2.为该数组"赋值",即将"Hello World"的每一个字符分别赋值给数组的每一个元素
    最终的结果:“数组的值”(注意不是b的值)等于"Hello World",而不是b指向一个字符串常量

    实际上,char * a = "Hello World"的写法是不规范的!

    因为a指向了字符常量,一旦strcpy(a, “string2”)就糟糕了,试图向只读的内存区域写入,程序会崩溃的!所以,我们还是应当按照类型相同赋值的原子来写代码:

    const char * a = "Hello World";
    

    保证意外赋值语句不会通过编译

另外作为函数的声明的参数的时候,char[]是被当做char *来处理的!两种形参声明写法完全等效!都是指针变量

关于const char *与char []的区别如下

const char * a = "string1";
char b[] = "string2"
  • 1.a是const char类型,b是char const类型
  • 2.a是一个指针变量,a的值(即a的指向)是可以改变的;但a只能指向(字符串)常量,指向的区域的内容不可改变
  • 3.b是一个指针常量,b的值(即b的指向)不能改变;但b指向的目标(数组b在内存中的区域)的内容是可变的
2.2 字符串之间的转换
2.2.1 转换表格
源格式->目标格式stringchar *const char *char[]
string-直接赋值直接赋值直接赋值
char *strcpy-const_castchar * = char
const char *c_str()直接赋值-const char * = char
char[]copy()strncpy_s()strncpy_s()-
2.2.2 总结方法
  • 1.变成string,直接赋值
  • 2.char[]变成别的,直接赋值
  • 3.char *变const char *容易,const char *变char *麻烦 <const_cast><char *>(const char *)
  • 4.string变char *要通过const char *中转
  • 5.变成char[],string逐个赋值
2.2.3 代码示例

一.string转为其它类型

1.string转const char*

#include <iostream>

int main(int argc, char* argv[])
{
    std::string str    = "Hello World!"; 	//初始化string类型,并具体赋值
    const char* constr = nullptr;			//初始化const char*类型,并赋值为空
    constr = str.c_str();					//string类型转const char*类型
    printf("%s\n", str.c_str());			//打印string类型数据 .c_str()
    printf("%s\n", constr);					//打印const char*类型数据
    return 0;
}

2.string转char *

#include <iostream>

int main(int argc, char* argv[])
{
    std::string str = "Hello World!";	//初始化string类型,并具体赋值
    char* c = nullptr;					//初始化char*类型,并赋值为空
    const char* constr = nullptr;		//初始化const char*类型,并赋值为空
    constr = str.c_str();				//string类型转const char*类型	
    c = const_cast<char*>(constr);		//const char*类型转char*类型
    printf("%s\n", str.c_str());		//打印string类型数据 .c_str()
    printf("%s\n", c);					//打印char*类型数据
    return 0;
}

3.string转char[]

#include <iostream>

int main(int argc, char* argv[])
{
    std::string str = "Hello World!";		//初始化string类型,并具体赋值
    char arr[20] = {0};						//初始化char[]类型,并赋值为空
    for(int i = 0; i < str.length(); ++i)	//string类型转char[]类型
    {
        arr[i] = str[i];
    }    
    printf("%s\n", str.c_str());			//打印string类型数据 .c_str()
    printf("%s\n", arr);					//打印char[]类型数据
    return 0;
}

二.const char* 转为其它类型

1.const char*转string

#include <iostream>

int main(int argc, char* argv[])
{
    const char* constr = "Hello World!";	//初始化const char* 类型,并具体赋值
    std::string str;						//初始化string类型
    str = constr;							//const char*类型转string类型
    printf("%s\n", constr);					//打印const char* 类型数据
    printf("%s\n", str.c_str());			//打印string类型数据
    return 0;
}

2.const char*转char*

#include <iostream>

int main(int argc, char* argv[])
{
    const char* constr = "Hello World!";	//初始化const char* 类型,并具体赋值
    char* c = nullptr;						//初始化char*类型
    c = const_cast<char*>(constr);			//const char*类型转char*类型
    printf("%s\n", constr);					//打印const char* 类型数据
    printf("%s\n", c);						//打印char*类型数据
    return 0;
}

3.const char*转char[]

#include <iostream>
#include <string.h>

int main(int argc, char* argv[])
{
    const char* constr = "Hello World!";	//初始化const char* 类型,并具体赋值
    char arr[20] = {0};						//初始化char[]类型,并赋值为空
    strncpy(arr, constr, 20);				//const char*类型转char[]类型
    printf("%s\n", constr);					//打印const char* 类型数据
    printf("%s\n", arr);					//打印char[]类型数据
    return 0;
}

三.char* 转为其它类型

1.char*转string

#include <iostream>

int main(int argc, char* argv[])
{
    char* c = "Hello World!";			//初始化char* 类型,并具体赋值
    std::string str;					//初始化string类型
    str = c;							//char*类型转string类型
    printf("%s\n", c);					//打印char* 类型数据
    printf("%s\n", str.c_str());		//打印string类型数据
    return 0;
}

2.char*转const char*

#include <iostream>

int main(int argc, char* argv[])
{
    char* c = "Hello World!";			//初始化char* 类型,并具体赋值
    const char* constr = nullptr;		//初始化const char* 类型,并具体赋值
    constr = c;							//char*类型转const char* 类型
    printf("%s\n", c);					//打印char* 类型数据
    printf("%s\n", constr);				//打印const char* 类型数据
    return 0;
}

3.char*转char[]

#include <iostream>
#include <string.h>

int main(int argc, char* argv[])
{
    char* c = "Hello World!";		//初始化char* 类型,并具体赋值
    char arr[20] = {0};				//初始化char[] 类型,并具体赋值
    strncpy(arr, c, 20);			//char*类型转char[] 类型
    printf("%s\n", c);				//打印char* 类型数据
    printf("%s\n", arr);			//打印char[]类型数据
    return 0;
}

四.char[]转为其它类型

1.char[]转string

#include <iostream>

int main(int argc, char* argv[])
{
    char arr[20] = "Hello World!";		//初始化char[] 类型并具体赋值
    std::string str;					//初始化string
    str = arr;    						//char[]类型转string类型
    printf("%s\n", arr);				//打印char[]类型数据
    printf("%s\n", str.c_str());		//打印string类型数据
    return 0;
}

2.char[]转const char*

#include <iostream>

int main(int argc, char* argv[])
{
    char arr[20] = "Hello World!";		//初始化char[] 类型并具体赋值
    const char* constr = nullptr;		//初始化const char*
    constr = arr;    					//char[]类型转const char* 类型
    printf("%s\n", arr);				//打印char[]类型数据
    printf("%s\n", constr);				//打印const char* 类型数据
    return 0;
}

3.char[]转char*

#include <iostream>

int main(int argc, char* argv[])
{
    char arr[20] = "Hello World!";		//初始化char[] 类型并具体赋值
    char* c = nullptr;					//初始化char*
    c = arr;							//char[]类型转char*类型
    printf("%s\n", arr);				//打印char[]类型数据
    printf("%s\n", c);					//打印char*类型数据
    return 0;
}

转载

转载自C++字符串与字符数组 详解,如有侵权,请联系删除

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值