(四十八)string类

简介:

string类可以将字符串视为输入到一个简单变量中,像使用一个变量那样使用他。


前提是:使用头文件#include<string>,另外,string类位于名称空间std中,因此需要使用using namespace std;或者std::string 或者using std::string。


在其他方面,又类似字符串那样使用。例如,在声明并初始化的时候,需要给字符串加上双引号或者单引号,像 string abc="aaa"; 这样。


上代码:

#include<iostream>
#include<string>	//使用string类必须调用头文件string
int main()
{
	using namespace std;
	char aaa[20];	//声明数组
	char bbb[20] = "很帅";	//声明数组并初始化
	string ccc;	//声明string类型变量,注意,使用string 需要启用名称空间std,并且无需指定长度
	string ddd = "真的很帅";	//声明string类型变量,并进行初始化,并且无需指定长度
	cout << "请输入一个人的名字" << endl;
	cin.getline(aaa, 20);	//读取一行字符串,需要指定长度
	cout << "请输入第二个人的名字" << endl;
	cin >> ccc;	//将用户输入的内容赋给变量ccc,注意,因为无需指定长度,因此即使很长也没有关系,但注意,中间不能有空格
	cin.get();	//注意,这一行代码是为了舍弃上一行代码cin读取到最后的换行符。假如下一行依然使用cin进行读取,是无需输入这行代码的
	string eee;
	cout << "请输入第三个人的名字,姓和名之间请加空格" << endl;
	getline(cin, eee);	//使用getline(cin,string的变量名)可以读取带空格的字符串,否则只读取字符串中空格之前的字符串
	string fff;	
	cout << "第四个人名:" << endl;
	cin >> fff;	//因为使用了cin,因此不需要再使用cin.get()来读取掉换行符。但是如果有空格,空格后的内容并不会被读取到变量fff之中
	cout << endl;
	cout << "你知道么?" << aaa <<" "<< bbb << endl;
	cout << "再告诉你一个秘密:" << ccc <<" "<< ddd << endl;
	cout << "第三件事是:" << eee << " 很厉害!" << endl;
	cout << "第四个人的名字是 " << fff;
	cout << endl;
	cout << "第一个人名字的第一个字符是:" << aaa[0] << endl;
	cout << "第二个人的名字的第二个字符是" << ccc[1] << endl;	//注意,读取第二个字符,中括号里面的数字为1,和字符串的方式相同
	cout << "string类的字符,可以通过数组那样的方式,来读取其中第N个字符,并且输入的数字为N=1。" << endl;
	system("pause");
	return 0;

}

输出结果:

请输入一个人的名字
a b
请输入第二个人的名字
cde
请输入第三个人的名字,姓和名之间请加空格
f g h
第四个人名:
i jk

你知道么?a b 很帅
再告诉你一个秘密:cde 真的很帅
第三件事是:f g h 很厉害!
第四个人的名字是 i
第一个人名字的第一个字符是:a
第二个人的名字的第二个字符是d
string类的字符,可以通过数组那样的方式,来读取其中第N个字符,并且输入的数字为N=1
。

注意:

①我们可以发现,第四个人名i jk只显示出字符i,而空格和jk则没有被读取。想要读取空格,就需要像第三个人名那样,使用函数getline(cin,string变量名)。

②虽然string类型可以像简单变量那样使用,但也可以被像字符串(数组)那样读取字符串(数组)中的第N个字符。读取方式几乎完全等同于读取字符串(数组)中字符的方法。

③string类型在创建变量时,相对于字符串(数组)那样需要标明长度的方式,显得更安全可靠。而且可以自动根据实际输入的字符串长度调整自己的长度。例如在string abc;的时候,abc的字符串长度为0,在string aaa="ab";的时候,字符串的长度则为3(包括最后的空白字符)。

 

 

string类的赋值:

我们知道,当有两个数组aaa,bbb时,其中aaa已经被初始化,但是bbb不能通过赋值的方式,将aaa中的字符串赋给数组bbb,如bbb=aaa;这种方式是错误的。

但是当有两个string类型的变量ccc和ddd时,假如ccc={"abbb"};已被初始化,是可以通过赋值的方式,将ccc的字符串赋给ddd,如ddd=ccc;cout<<ddd;的输出结果是abbb。

 

 

string类的相加:

也可以将两个string类型的变量进行相加,并赋值给第三个string变量,后者将被加到前者的字符串的后面。方法是:string变量C=string变量A+string变量B。

例如string ccc = { "abc" };string ddd = "efg";string eee = ccc + ddd;cout << eee;则输出结果为abcefg(注意,中间没有空格或者别的什么)。

 

也可以直接将第二个string类型变量加到第一个string后面,第一个变量则为原来两个变量拼合起来。方法是 目标string变量 += 被加的string变量。

例如: string ccc = { "abc" };string ddd = "efg";ccc += ddd;cout << ccc;输出结果为abcefg

 

关于相加,第一种方式是相加的两个变量没有变化,第三个变量为相加两个变量合起来之后的字符串。第二种方式是被变的string变量没有变量,目标string变量变化为两个变量合并起来之后的字符串。

 

上代码:

#include<iostream>
#include<string>

int main()
{
	using namespace std;
	string aa;
	string bb = "很漂亮";
	string cc;
	string dd = "真的";	//声明四个string变量,其中两个进行初始化
	cout << "请输入一个妹子的名字:";
	cin >> aa;	//要求用户输入一个名字,并赋值给string变量aa
	cc = aa + bb;	//变量cc由aa和bb拼接而成,方式是用加号
	cout << cc << endl;
	cout << endl;
	aa += dd;	//将变量dd加到变量aa的字符串后面
	aa += bb;	//再将变量bb加到变量aa的字符串后面
	cout << aa << endl;	//变量aa是由原来的aa后面加上变量dd的字符串,然后后面再加上变量bb的字符串
	cout << endl;
	aa = "杨幂(人称大幂幂)";	//可以直接给已经有字符串的string变量进行赋值
	cout << aa << "是一个明星。\n";	//显示新的string变量aa
	cc = aa;	//可以通过直接赋值的方式,将变量aa的值赋值给变量cc
	cout << cc << "也" << bb << endl;
	system("pause");
	return	0;
}

输出结果为:


请输入一个妹子的名字:阿木
阿木很漂亮

阿木真的很漂亮

杨幂(人称大幂幂)是一个明星。
杨幂(人称大幂幂)也很漂亮

在连续相加的时候:

aa += dd; //将变量dd加到变量aa的字符串后面

aa += bb; //再将变量bb加到变量aa的字符串后面

也可以直接通过这样的一行代码来起到相同的效果:

aa += dd += bb;

 

经过实际测试,两者效果是等效的。

 

注意:

①string类有自动调节字符串长度的功能。例如变量aa初始长度为0,在用户输入进行赋值后,字符串为4个字节(两个汉字),其后进行两次string变量相加,长度变为20个字节,然后又在之后进行赋值,长度变成18个字节(7个汉字2个括号每个占2个字节)。注意,sizeof 变量名是无法测出string类变量所占空间的,他是动态分配的。

要想测试变量所占空间,需要通过 变量名.size() 这样的方法来进行。如 string aa;cout << aa.size()<< endl; 就是输出string变量aa的长度,结果为0。注意,这种方法不计算最后的空白符

②如果不是string类,而是C-风格的字符串。

可以使用strcat(目标字符串A,字符串B)来将字符串B的内容复制到字符串A的后面;

另外是strcpy(目标字符串A,字符串B)可以将字符串B全部复制到(即理解为赋值)到目标字符串A之中。

但两个存在的问题是可能因为长度超出,而导致数据损坏等问题。

 

在C函数库里,则是strncpy()和strncat()——多了一个n,并且这两个函数支持指出目标数组的最大允许长度的第三个参数,因此更为安全(避免因数据溢出而导致数据损坏),但增加了程序输入的复杂度。

 

总之,还是用string类好。

 

显示字符串的字符数:

在显示字符串的的字符数时,string类的字符串和C-风格的字符串的方法是不同的。注意, 显示字符数 和 显示字符串长度 是不一样的,后者比前者多一个空字符。

①string类显示字符串的字符数的方法如下:变量名.size()。例如 cout << aa.size() << endl; //显示string类字符串的字符数,不包含末尾空字符,但包含空格字符

②显示C-风格的字符串的字符数的方法如下:strlen(变量名)。例如:

char aaa[5] = "abcd";
cout << strlen(aaa) << endl;	//显示C-风格字符串的字符数
cout << sizeof(aaa) << endl;	//显示C-风格字符串的字符长度,包含结尾空字符


输出的结果分别为:4和5



目录
相关文章
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
39 0
java基础(13)String类
|
3月前
|
API 索引
String类下常用API
String类下常用API
44 1
|
1月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
56 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
1月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
26 2
|
1月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
21 1
|
2月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
1月前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
52 4
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
25 2
|
1月前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
36 4
|
1月前
|
存储 编译器 程序员
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
【C++篇】手撕 C++ string 类:从零实现到深入剖析的模拟之路
64 2

热门文章

最新文章

下一篇
无影云桌面