c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

文章目录

  • c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串
  • 16.1.3 使用字符串
    • 程序清单16.3 hangman.cpp


16.1.3 使用字符串

现在,您知道可以使用不同方式来创建 string 对象、显示 sting 对象的内容、将数据读取和附加到 string 对象中、给 string 对象赋值以及将两个 string 对象连结起来。除此之外,还能做些什么呢?可以比较字符串。String类对全部6个关系运算符都进行了重载。如果在机器排列序列中,一个对象位于另一个对象的前面,则前者被视为小于后者。如果机器排列序列为 ASCI码,则数字将小于大写字符,而大写字符小于小写字符。对于每个关系运算符,都以三种方式被重载,以便能够将 string 对象与另一个string 对象、C-风格字符串进行比较,并能够将C-风格字符串与 string 对象进行比较:

string snakel("cobra");
string snake2("coral");
char snake3[20]="anaconda";
if(snakel<snake 2)
//operator<(const string &,const string &)
...
if(snakel == snake3)
//operator==(const string &,const char *)
::
if(snake3 != snake2)
//operator!=(const char *,const string &)

可以确定字符串的长度。size()和length()成员函数都返回字符串中的字符数:if(snakel.length()== snake2.size())

cout <<"Both strings have the same length.\n'

为什么这两个函数完成相同的任务呢?length()成员来自较早版本的string类,而size()则是为提供STL兼容性而添加的。
可以以多种不同的方式在字符串中搜索给定的子字符串或字符。表16.2简要地描述了 find()方法的4个版本。如前所述,string:npos是字符串可存储的最大字符数,通常是无符号int或无符号 long 的最大取值。
在这里插入图片描述
在这里插入图片描述
string 库还提供了相关的方法:rfind()、find first of()、find last of()、find first not of()和find last not of),它们的重载函数特征标都与 find()方法相同。rfind()方法查找子字符串或字符最后一次出现的位置;find firstof()方法在字符串中查找参数中任何一个字符首次出现的位置。例如,下面的语句返回r在“cobra”中的位置(即索引3),因为这是“hark”中各个字母在“cobra”首次出现的位置:int where =snakel.find first of(“hark”);
find last of()方法的功能与此相同,只是它査找的是最后一次出现的位置。因此,下面的语句返回a在“cobra”中的位置:
int where =snakel.last first of(“hark”);
tind first not ot)方法在字符用中查找第一个不包含在参数中的字符,因此下面的语句返回c在“cobra”中的位置,因为“hark”中没有c:
int where =snakel.find first not of(“hark”);
在本章最后的练习中,您将了解findlast notof()。
还有很多其他的方法,这些方法足以创建一个非图形版本的 Hangman 拼字游戏。该游戏将一系列的单词存储在一个 string 对象数组中,然后随机选择一个单词,让人猜测单词的字母。如果猜错6次,玩家就输了。该程序使用 find()函数来检查玩家的猜测,使用+=运算符创建一个 string 对象来记录玩家的错误猜测。为记录玩家猜对的情况,程序创建了一个单词,其长度与被猜的单词相同,但包含的是连字符。玩家猜对字符时,将用该字符替换相应的连字符。程序清单16.3列出了该程序的代码。

程序清单16.3 hangman.cpp

// hangman.cpp -- some string methods
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cctype>
using std::string;
const int NUM = 26;
const string wordlist[NUM] = {"apiary", "beetle", "cereal",
    "danger", "ensign", "florid", "garage", "health", "insult",
    "jackal", "keeper", "loaner", "manage", "nonce", "onset",
    "plaid", "quilt", "remote", "stolid", "train", "useful",
    "valid", "whence", "xenon", "yearn", "zippy"};

int main()
{
    using std::cout;
    using std::cin;
    using std::tolower;
    using std::endl;
    
    std::srand(std::time(0));
    char play;
    cout << "Will you play a word game? <y/n> ";
    cin >> play;
    play = tolower(play);
    while (play == 'y')
    {
        string target = wordlist[std::rand() % NUM];
        int length = target.length();
        string attempt(length, '-');
        string badchars;
        int guesses = 6;
        cout << "Guess my secret word. It has " << length
            << " letters, and you guess\n"
            << "one letter at a time. You get " << guesses
            << " wrong guesses.\n";
        cout << "Your word: " << attempt << endl;
        while (guesses > 0 && attempt != target)
        {
            char letter;
            cout << "Guess a letter: ";
            cin >> letter;
            if (badchars.find(letter) != string::npos
                || attempt.find(letter) != string::npos)
            {
                cout << "You already guessed that. Try again.\n";
                    continue;
            }
            int loc = target.find(letter);
            if (loc == string::npos)
            {
                cout << "Oh, bad guess!\n";
                --guesses;
                badchars += letter; // add to string
            }
            else
            {
                cout << "Good guess!\n";
                attempt[loc]=letter;
                // check if letter appears again
                loc = target.find(letter, loc + 1);
                while (loc != string::npos)
                {
                    attempt[loc]=letter;
                    loc = target.find(letter, loc + 1);
                }
           }
            cout << "Your word: " << attempt << endl;
            if (attempt != target)
            {
                if (badchars.length() > 0)
                    cout << "Bad choices: " << badchars << endl;
                cout << guesses << " bad guesses left\n";
            }
        }
        if (guesses > 0)
            cout << "That's right!\n";
        else
            cout << "Sorry, the word is " << target << ".\n";

        cout << "Will you play another? <y/n> ";
        cin >> play;
        play = tolower(play);
    }

    cout << "Bye\n";

    return 0; 
}

程序说明
在程序清单16.3中,由于关系运算符被重载,因此可以像对待数值变量那样对待字符串:

while(guesses >0&& attempt !=target)

与对C-风格字符串使用strcmp()相比,这样简单些,该程序使用 find()来检査玩家以前是否猜过某个字符。如果是,则它要么位于 badchars 字符串(猜错)中,要么位于attempt字符串(猜对)中:

if(badchars.find(letter)!= string::nposattempt.find(letter)!=string::npos)

npos 变量是 string 类的静态成员,它的值是 string 对象能存储的最大字符数。由于索引从0开始,所以它比最大的索引值大1,因此可以使用它来表示没有查找到字符或字符串。
该程序利用了这样一个事实:+=运算符的某个重载版本使得能够将一个字符附加到字符串中:

badchars +=letter;//append a char to a string object

该程序的核心是从检查玩家选择的字符是否位于被猜测的单词中开始的:

int loc=target.find(letter);

如果1oc是一个有效的值,则可以将该字母放置在答案字符串的相应位置

attempt[loc]=letter;

然而,由于字母在被猜测的单词中可能出现多次,所以程序必须一直进行检查。该程序使用了find()的第二个可选参数,该参数可以指定从字符串什么位置开始搜索。因为字母是在位置loc 找到的,所以下一次搜索应从1oc+1 开始。while循环使搜索一直进行下去,直到找不到该字符为止。如果loc 位于字符串尾,则表明find()没有找到该字符。

//check if letter appears again
loc =target.find(letter,loc+1);
while(loc != string::npos)
{
     attempt[loc]=letter;
    loc =target.find(letter,loc +1);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801335.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

暑期大数据人工智能企业项目试岗实训班

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

2024.7.16作业

使用结构体完成学生&#xff08;学号、姓名、性别、成绩&#xff09;管理系统 1> 使用菜单实现 2> 功能1&#xff1a;完成对学生信息的录入&#xff0c;确定人数&#xff0c;完成输入 2> 功能2&#xff1a;完成对学生信息的输出 3> 功能3&#xff1a;输出成绩最…

Linux C | 管道open打开方式

Linux C | 管道open打开方式 1.参考 1. 管道 2.现象 是的&#xff0c;这段代码在调用 open(AUDIOIN_FIFO, O_RDONLY) 时可能会被阻塞。原因是 FIFO&#xff08;命名管道&#xff09;在以只读模式打开时&#xff0c;如果没有其他进程以写模式打开该 FIFO&#xff0c;open 调用将…

ASP.NET Core----基础学习07----ViewStart ViewImports文件的使用

文章目录 1._ViewStart.cshtml的使用2.更换Layout文件3._ViewImports.cshtml文件的使用 1._ViewStart.cshtml的使用 step1&#xff1a; 在Views文件夹下面创建_ViewStart.cshtml文件 step2&#xff1a; 删掉视图文件中的Layout设置行 step3&#xff1a; 最终显示效果&#xff…

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

企业智能制造赋能的环境条件为什么重要?需要准备什么样的环境?

在全球制造业不断演进的今天&#xff0c;智能制造已经成为推动行业创新和转型的关键力量。它不仅代表了技术的革新&#xff0c;更是企业管理模式和运营思路的全面升级。然而&#xff0c;智能制造的落地实施并非一蹴而就&#xff0c;它需要企业在环境条件上做好充分的准备&#…

Java设计模式的7个设计原则

Java设计模式的7个设计原则是面向对象设计领域中的重要指导方针&#xff0c;它们旨在提高软件系统的可维护性、可扩展性、可复用性和灵活性。以下是这7个设计原则的详细解释&#xff1a; 1. 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09; 定义&#xff1a;一个…

tinymce vue拓展多图上传 实现拖拽切换位置,图片排序

实现功能&#xff1a;基于tinymce TinyMCE中文文档中文手册 拖拽图片排序&#xff0c;去掉全部上传按钮&#xff0c;点击保存上传图片并关闭弹窗&#xff0c;优化了一些交互提示 声明&#xff1a;本人不是做vue前端的&#xff0c;可能有些更好的方法实现拖拽或者其他一些开源…

TS 入门(五):TypeScript接口与类

目录 前言回顾高级类型与类型操作1. 接口a. 基本接口b. 可选属性和只读属性c. 函数类型接口d. 可索引类型e. 接口继承 2. 类a. 基本类b. 类的成员&#xff08;属性和方法&#xff09;c. 构造函数d. 继承和派生类e. 公有、私有和受保护的修饰符f. 静态属性和方法g. 抽象类 扩展知…

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook&#xff0c;用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应&#xff0c;useState 让函数组件也能拥有…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片&#xff0c;因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同&#xff0c;但图像&#xff08;例如 JPG 格式&#xff09;在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作…

设计模式-UML类图

1.UML概述 UML-统一建模语言&#xff0c;用来设计软件的可视化建模语言&#xff1b; 1.1 UML分类 静态结构图&#xff1a;类图、对象图、组件图、部署图动态行为图&#xff1a;状态图、活动图、时序图、协作图、构件图等 类图&#xff1a;反应类与类结构之间的关系&#xff0…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会&#xff0c;安全问题愈发受到重视。随着科技的进步&#xff0c;非法闯入智能监测摄像机应运而生&#xff0c;成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能&#xff0c;还集成了智能识别和报警系统&#xff0c;能够在第一时间内检测到潜在的入侵行…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题&#xff1a;《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源&#xff1a;Glasgow大学&#xff1b;爱丁堡大学 连接&#xff1a;https://arxiv.org/abs/2406.13099 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何…

Vue3 组件向下通信 祖孙组件的通信 provide与inject

介绍 当父子间通信可以使用props&#xff0c;祖孙使用provide&#xff08;传递&#xff09;或inject&#xff08;接收&#xff09;&#xff0c; 这时不管组件套的多深都可以向下传递。 例子 现在有一个需求&#xff0c;把App.vue的数据传递到MusciPlay.vue里。 App.vue …

Latte: Latent Diffusion Transformer for Video Generation

文章目录 AbstractIntroductionMethodology潜在扩散模型的初步研究Latte的模型变体Latte的实验验证潜在视频片段的patch embeddingTimestep-class information injectionTemporal positional embedding通过学习策略增强视频生成 Experiments Abstract Latte首先从输入的视频提…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板&#xff0c;其实就是成品网站&#xff0c;上传php空间即可使用&#xff0c;属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站&#xff0c;基本上都可以找到适应你手头客户需要的一款&#xff0c;简单修改一下即可交活收钱了。…

python实例练习00001:打开文件输出文件内容

try:file input(enter the file :)with open(file, r) as f:data f.read()print(data) except FileNotFoundError:print(fthe file {file} does not exists:) 打开windows的cmd运行程序&#xff0c;效果如下&#xff1a;

晏子春秋-读书笔记四

景公游于寿春&#xff0c;坐于路寝。公曰&#xff1a;“嗟乎&#xff01;使我有此国&#xff0c;吾将如之何&#xff1f;”晏子对曰&#xff1a;“此国非君之有也&#xff0c;乃先君之有也。君若欲有之&#xff0c;则修先君之德&#xff0c;以顺民心&#xff1b;若不欲有之&…