C++入坑系列(四)复合类型之字符串

本文介绍了C++中的字符串处理,特别是string类的使用。C++中的string是一个类,提供了一系列方便的操作方法,如赋值、比较等。与C语言中的字符数组不同,应使用string.size()获取字符串长度,而不是strlen。此外,文章还提到了C++11引入的原始字符串和面向行的字符串输入输出方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

字符串是存储在内存中的连续字节中以 \0 作为结尾的的一系列字符。在C语言中,我们将其称之为C风格字符串,而在C++中,我们使用string类的方式去处理字符串。本文,我们将着重介绍C++里面的string类的知识。虽然处理方法不同,但是C++仍然可以使用C语言中的处理方法。

C语言中的字符串

定义

由于在C语言中不支持字符串数据类型,所以需要使用其他的方法实现字符串的相关操作。主要有两种方法
1、利用字符数组的方式:
在利用字符数组定义一个字符串时,同样具有两种形式,如下:

/*方式1*/
char char_string[] = {'H','e','l','l','o',' ','L','i','n','u','x','\0,};//显示'\0'
/*方式2*/
char char_string[] = "Hello Linux";//隐藏了'\0'

需要注意的是,如果方式1中的最后一个字符不是 \0 ,那么该字符数组不是字符串,而仅仅是一个普通的字符数组。
2、利用字符串指针的方式,如下:

char* pString = "Helllo Linux";

操作字符串的相关函数

在C语言中,系统提供了操作字符串的相关库函数,用于简化对字符串的处理。如果需要使用它们的话,需要首先包含string.h(C语言中)头文件或者**cstring(C++中)**头文件。常见的字符串处理函数如下:

函数名称函数作用
strlen计算字符串的长度(不包括\0)并返回
strcpy对两个字符串进行比较(连续进行单个字符的比较)
strcat将两个字符串进行连接
strcpy将字符串复制给另一个字符串

有关上述库函数的原型,请直接进入string.h头文件中进行查看。
程序示例1:计算字符串的长度

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char* string1 = "Hello Linux";
	cout << strlen(string1) << endl;//长度为11
	char string2[] = "This is a test";
	cout << strlen(string2) << endl;//长度为14
}

程序示例2:拷贝字符串

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    const char* array1 = "Hello Linux";
    char array2[20] = {' '};
    strcpy(array2,array1);//在实际工程中慎用!!!因为只会拷贝\0前面的字符,更好的方法是使用strncoy函数实现字符串的拷贝
    cout << array2 << endl;//输出Hello Linux
    return 0;
}

小结

对于C语言风格的字符串,其实际上就是一个字符数组,所以处理的方式与数组的处理方式类似,同样也会受到与数组同样的限制,比如:不能整体赋值等。只是,C语言中增加了一些专门处理字符串的一些库函数,简化了相关的操作,如上所述。

C++中的字符串

定义

在C++中,新增了一个数据类型string专门用于声明一个字符串。严格上来说,string是一个类数据类型,我们称之为string类,如果要使用该类,必须包含string头文件,并且,string类还包含在命名空间std中,所以我们必须利用using namespace std使用该命名空间,或者直接使用using::string,才能在程序中使用该类及其相应的属性。

操作字符串的方法

由于C语言中都是以字符数组或者字符指针的形式定义字符串的,所以必须利用相应的字符串操作库函数才能实现字符串的拷贝、连接、复制等功能。但是在C++中,由于使用的是string类,所以便可以利用简单的成员函数,就可以实现上述功能。再结合运算符重载,使得C++处理字符串变得更加灵活。
比如:我们可以直接利用赋值运算符=,将一个string对象赋值给另一个string对象,也可以直接通过关系运算符对两个string对象直接进行比较等等。总之,使用起来更加灵活,简单。唯一需要注意的是,在使用之前需要包含头文件string以及使用命名空间std。
综合程序示例

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str1 = "Hello Linux";
    string str2;
    str2 = str1;//将str1字符串拷贝给str1
    cout << str2 << endl;
    cout << str2.size() << endl;//输出str2字符串的长度,也是忽略\0
    str2 += str1;//将str2和str1字符串进行拼接,然后赋值给str2
    cout << str2 << endl;
    cout << str2.size() << endl;//再次输出str2字符串的长度
    if(str1 == str2)//判断str1与str2是否相等,很明显,不相等
    {
        cout << "str1 and str2 is equal" << endl;
    }
    else
    {
        cout << "str1 and str2 is not equal" << endl;
    }
    return 0;
}

程序运行结果如下:
在这里插入图片描述

注意事项–Very Important

绝对不可以利用strlen函数计算string对象字符串的长度。因为strlen是计算字符数组中字符串长度的库函数,而利用string关键字创建的字符串是string类的一个对象。而只能利用诸如string类的成员函数**string.size()**获取字符串的长度的。

字符与字符串之间的差异

无论是在C语言还是C++中,字符都是在单引号 ’ ’ 中,而字符串都是在双引号 " " 中,是两种完全不同的数据类型。即使在下面的情况下,两种数据类型也是不可以互相转换的。

char signalChar = 'S';//表示一个字符S
char* stringChar = "S";//表示一个字符串,S和\0

我们只需要牢记:用单引号括起来的就是字符,用双引号括起来的就是字符串!!!

补充1:C++11标准新增的原始字符串

在C++11标准中,新增了一个原始字符串类型。与普通字符串的区别在于,原始字符串中不存在转义序列等字符,每个字符代表了它本身的含义。比如:\n在原始字符串中,就仅仅代表了字符\和字符n。那么,如何在程序中使用原始字符串呢?方法就是利用**"()"**作为界定符,如下所示:

//原始字符串的使用
cout << R"(This is a test\n)" << '\n';//输出结果:This is a test\n

由于原始字符创并不常见,所以此处仅仅做一个简单的介绍。详细的内容请查阅C++11中的相关介绍。并且,如果需要使用这一类型,那么您的编译器必须支持C++11的标准。

补充2:字符串的输入和输出

利用cin输入字符串(面向单词)

当程序中利用cin输入字符串时,cin使用空白,比如:空格、换行符、制表符等来确定字符串的结束位置。这意味着,当输入的字符串中间存在空白的情况时,将导致赋值为相应变量的字符串的数据丢失,为便于说明,示例如下:

string testString1,testString2;
cin >> testString1;//输入testString1字符串
//输入Hello
cout << "testString1字符串为:" << testString1 << endl;//输出testString1字符串
cin >> testString2;//输入testString2字符串
//输入Hello Linux
cout << "testString2字符串为:"<< testString2 << endl;//输出testString2字符串

输出结果如下:
在这里插入图片描述

输入一行字符串(面向行)

在上面的例程中,可以发现:利用cin输入字符串时,空白便会被认为是字符串的结束位置。有时,我们需要输入一行包含空格的字符串,此时,直接利用cin进行输入便无法满足要求了。
在istream类中,提供了一些面向行的成员函数,解决了上述问题,只有当遇到换行符时,才会被人为是字符串的结束。在实际应用中,我们这里介绍三种方法实现此目的:
1、cin类对象的getline()成员函数:读取指定数目的字符或遇到换行符时停止,并且不保存换行符,主要用于操作字符数组:

char test[20];
cin.getline(test,10);//从输入的语句中读取10个元素,存入test数组中

2、getline()函数:读取一整行的字符,遇到换行符才停止,主要用于操作string对象:

string test;
getline(cin,test);//从输入获取一行字符串,并保存在test字符串中

3、get()成员函数,使用方法和第一点的getline()成员函数类似,但是会保存换行符,所以需要额外注意:

cin.get(name1,10);//读取第一行数据
cin.get();//读取第一行数据末尾的换行符
cin.get(name2,10);//读取第二行数据
cin.get();//读取第二行数据末尾的换行符

小结

有关输入队列缓冲的知识,涉及到IO缓冲相关内容,由于不是本文关注的重点,所以暂时不进行更多的拓展。在后续的笔记中,进行更加详细的讨论。

总结

本文主要对字符串进行了简要的介绍。总而言之,C++中的string类就一个字,方便!即使如此,在使用的过程中,需要特别注意C语言中的字符数组与C++中的字符串类型的区别于联系!
本文的疏漏和不足之处,还望各位读者能够及时指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值