C++菜鸟学习笔记系列(7)——标准库类型string

简介: C++菜鸟学习笔记系列(7)——标准库类型string

C++菜鸟学习笔记系列(7)

本期主题:标准库类型string

我们已经在前面介绍过C++中存在为我们设置好的内置类型。这些类型,比如数字和字符,体现了大多数计算机本身具备的能力。同时为了方便我们的使用,C++还为我们提供了自定义类型的方法。

除了上述之外C++语言还定义了一个内容丰富的抽象数据类型库。string 就是其中一种非常重要的标准库类型。它可以支持可变长字符串,下面作者就对其的使用进行简单介绍。

标准库类型 string表示可变长的字符序列,使用 string 类型必须先包含 string 头文件。作为标准库的一部分,string 定义在命名空间 std 中。所以在使用之前我们一般都先添加上以下代码,

#include <string>
using std::string;

当然在第二行代码中我们也可以替换成:

using namespace std;

这样我们就使用了整个 std 命名空间,当然也就包含了 string 的定义了。与前述的第一种方法相比第二种方法好像看起来更加简单方便,但是它存在的缺点是命名空间 std 中包含了很多定义好的名字,如果我们不经意间使用了重复的名字则会造成始料未及的冲突。

(注意:一般来说,我们最好不要在头文件中使用 using 声明)

1.定义和初始化 string 对象

如何初始化类的对象是由类的本身所决定的。一个类可以定义很多初始化对象的方式,只不过这些方式之间有所区别,可以是初始值的数量不同或是初始值的类型不同等。

下面我们介绍一些初始化string对象的常用方式。

string s1; //s1是一个空串""
string s2 (s1); //s2是s1的副本
string s3 = s2; //s3是s2的副本,相当于s3(s3)
string s4 ("hello"); //s4是字符串字面值hello的副本,是直接赋值
string s5 = "hello"; //s5是字符串字面值hello的副本,相当于 s5 ("hello"),拷贝初始化
string s6 (4,'c'); //把s6初始化为n个(这里是4) c 组成的字符串

2.string 对象上的操作

读写 string 对象

我们在C++菜鸟学习笔记系列(1)中已经介绍过通过使用标准库中的iostream来读写值。同样的,我们也可以使用IO操作符读写 string 对象:

/*
Author: wxc_1998
Date: 2018/9/29
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  cin >> s;
  cout << s << endl;
  cout << "press any key to continue!";
  cin.clear();
  cin.sync();
  cin.get();
}

如上所示,字符串的输入输出和内置类型基本是相同的,但是我们要注意的是在使用 cin 操作时string对象会自动忽略开头的空白(空格符、换行符、制表符等)并从第一个真正的字符开始赌气,直到遇到下一处空白停止。

例如:我们输入“ 123 ”则输入的对象将是“123”。

通过上面的说明我们可以发现这样读取的字符串中是不包括空格、制标符等的,而如果我们在实际应用中却想要输入一个空格怎么办呢?这就需要用到 getline 操作了。

  while (getline (cin,line))
  {
    cout << line << endl;
  }

改写之后的程序遇到换行符停止,可以每次输入一整行,保留输入时的空白符。

两个string 对象相加

两个 string 对象相加得到一个新的 string 对象,其内容是把左侧的运算对象和右侧的运算对象串接而成。

/*
Author: wxc_1998
Date: 2018/9/29
*/
#include <iostream>
#include <string>
using namespace std;
void main()
{
  string s1("hello");
  string s2 = "world";
  string s3 = s1 + s2;
  cout << "s1 + s2 = " << s3 << endl;
  string s4 = s1 + "," + s2;
  //string s5 = "hello" + "," + s2; 
  cout << "s4 is : " << s4 << endl;
  cout << "press any key to continue!";
    cin.clear();
    cin.sync();
    cin.get();
}

如上代码所示,我们把s1,s2两个字符串执行相加的操作就相当于连接两个字符串,

因为标准库允许把字符字面值和字符串字面值转换为 string 对象,所以我们也可以把 string 对象和字符字面值及字符串字面值混合使用如 s4但是我们必须还要确保每个加法运算符(+)两侧的运算对象至少有一个是 string 对象。若直接相加则会出现错误,错误示例如下所示:

string s5 = "hello" + "," + s2; 

(注意: C++语言中的字符串字面值并不是标准库类型 string 的对象。即字符串字面值与标准库类型 string 并不是同一种类型)

处理 string 对象中的字符

我们在学习C语言时,或者在平常的一些练习题中经常看到把一个字符串中的字符大写改成小写、判读是否出现了某个字符之类的问题。这些看起来对我们的实际使用并没有太多用处,但是存在即合理,我们在这里也简单介绍一下对 string 对象中的字符进行操作的方法。

基于范围的for语句

下面我们将介绍使用范围for语句,这种语句遍历给定序列中的每个元素,并对序列中的每个元素执行某种操作,其语法形式为:

for ( 变量: 对象序列)
  {
    执行操作
  }

来我们看一个具体示例:

/*
Author: wxc_1998
Date: 2018/9/29
*/
#include <iostream>
#include <string>
using namespace std;
void main()
{
  string s("hello world!");
  int punct_count = 0;
  for(char c : s)
  {
    if (ispunct(c))
      ++punct_count;
  }
  cout << "the number of punctuation characters is :" << punct_count << endl;
  cout << "press any key to continue!";
  cin.clear();
    cin.sync();
    cin.get();
}

注意:必须要使用13年以后的编译器才可以支持C11的范围for语句。

使用下标处理一部分字符


访问 string 对象的每一个字符有两种方式,一种是使用下标,另一种则是使用迭代器(我们后续再介绍)。

下标的值称为“下标”或“索引”,任何表达式只要它的值是一个整型值就能作为索引,在所有的 string 对象中,其字符的索引值一定是在区间[ 0,string.size() )范围内。

下面我们看一个实例,实现从10进制到16进制数的转换。

/*
Author: wxc_1998
Date: 2018/9/29
*/
#include <iostream>
#include <string>
using namespace std;
void main()
{
  string s = "0123456789ABCDEF";
  cout << "Enter a series of numbers between 0 and 15"
    << " spearated by space. Hit 'ctrl+z' when finished: "
    << endl;
  string result;
  unsigned int n;
  while (cin >> n)
  {
    if (n < s.size())
    {
      result = result + s[n];
    }
  }
  cout << "the hex number is :" << result << endl;
  cout << "press any key to continue!";
  cin.clear();
    cin.sync();
    cin.get();
}

(注意:我们在输入数据结束while循环时可以输入ctrl+z)

好了这次博客就写到这里了,我们下次再见。

注:虽然这篇博客的内容十分简单,但是大家若有转载还请标明出处!

还有大家若对博客中的内容有任何问题可以随时联系我提问。

目录
相关文章
|
1月前
|
数据安全/隐私保护
【Azure Function App】PowerShell Function 执行 Get-AzAccessToken 的返回值类型问题:System.String 与 System.Security.SecureString
将PowerShell Function部署到Azure Function App后,Get-AzAccessToken返回值类型在不同环境中有差异。正常为SecureString类型,但部分情况下为System.String类型,导致后续处理出错。解决方法是在profile.ps1中设置环境变量$env:AZUREPS_OUTPUT_PLAINTEXT_AZACCESSTOKEN=false,以禁用明文输出。
|
8月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
存储 JSON JavaScript
[go]byte类型, string 类型, json 类型
本文介绍了Go语言中byte类型的基本概念、特点及用法。byte是8位无符号整数,取值范围为0-255,常用于二进制数据操作,如网络通信和文件读写。文章还详细说明了byte与字符串的转换、遍历byte数据以及与其他类型间的转换。此外,探讨了Go中json.Marshal和json.Unmarshal函数实现[]byte与JSON间的转换,并对比了[]byte与JSON的区别,帮助开发者更好地理解其应用场景与差异。
158 2
|
4月前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
94 3
|
4月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
140 0
|
8月前
|
C++
模拟实现c++中的string
模拟实现c++中的string
|
11月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
454 5
|
11月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
347 2
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
105 1
|
21天前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
166 5