打印字符串中每个单词的第一个和最后一个字符

介绍

在计算机科学中,字符串(string)是由零个或多个字符组成的有限序列。通常情况下,字符串被声明为字符数组,也就是C风格的字符串。在我们的日常使用中,我们会遇到需要对字符串进行处理的情况,例如查找某个字符或者将字符串分割成单词。本文会针对字符串处理中的一个问题——打印字符串中每个单词的第一个和最后一个字符进行讲解。

如何实现

步骤

要打印字符串中每个单词的第一个和最后一个字符,我们需要对原字符串进行分割,将每个单词提取出来,然后获取其第一个和最后一个字符。下面是具体的步骤:

利用字符串分割函数将字符串分割为单词

对每个单词获取第一个和最后一个字符

将获取到的字符打印出来

接下来我们会逐个步骤进行讲解。

分割字符串

分割字符串的方法有很多种,本文介绍其中一种比较简单的方法,即使用字符串流(stringstream)进行分割。具体实现方法如下:

#include <sstream>

#include <vector>

#include <string>

vector<string> splitString(string str) {

stringstream ss(str);

vector<string> res;

string word;

while (ss >> word) {

res.push_back(word);

}

return res;

}

上述代码中,我们首先定义了一个字符串流ss,然后将原字符串str传入字符串流中,接着利用vector存储每个单词,最后返回所有单词的vector。需要注意的是,此方法需要C++11以上的支持。

获取第一个和最后一个字符

对于每个单词,我们需要获取它的第一个和最后一个字符。获取第一个字符比较简单,直接使用字符串下标即可。获取最后一个字符,则需要注意字符串中可能存在空格或者标点符号,因此需要从字符串末尾逐个向前查找,直到找到第一个非空格和标点符号的字符。

vector<pair<char, char>> getFirstAndLastChar(vector<string> words) {

vector<pair<char, char>> res;

for (auto word : words) {

char first = word[0];

char last = word[word.size() - 1];

if (last == '.' || last == ',' || last == '?' || last == '!') {

auto it = word.rbegin();

while (++it != word.rend()) {

if (*it != '.' && *it != ',' && *it != '?' && *it != '!') {

last = *it;

break;

}

}

}

res.push_back(make_pair(first, last));

}

return res;

}

上述代码中,我们首先定义一个vector用于存储每个单词的第一个和最后一个字符,碰到标点符号则从后往前查找,找到第一个非标点符号的字符,作为最后一个字符。

打印结果

最后,我们只需要将获取到的第一个和最后一个字符打印出来即可。注意,在打印结果中,我们需要同时打印出原单词,因此需要使用格式化输出的方法。具体实现方法如下:

void printResult(vector<string> words, vector<pair<char, char>> firstAndLastChar) {

for (int i = 0; i < words.size(); i++) {

printf("%s: %c-%c\n", words[i].c_str(), firstAndLastChar[i].first, firstAndLastChar[i].second);

}

}

上述代码中,我们首先使用for循环逐个遍历每个单词,然后使用printf进行格式化输出,输出格式为“单词: 第一个字符-最后一个字符”。

代码实现

下面是完整的代码实现:

#include <iostream>

#include <sstream>

#include <vector>

#include <string>

using namespace std;

vector<string> splitString(string str) {

stringstream ss(str);

vector<string> res;

string word;

while (ss >> word) {

res.push_back(word);

}

return res;

}

vector<pair<char, char>> getFirstAndLastChar(vector<string> words) {

vector<pair<char, char>> res;

for (auto word : words) {

char first = word[0];

char last = word[word.size() - 1];

if (last == '.' || last == ',' || last == '?' || last == '!') {

auto it = word.rbegin();

while (++it != word.rend()) {

if (*it != '.' && *it != ',' && *it != '?' && *it != '!') {

last = *it;

break;

}

}

}

res.push_back(make_pair(first, last));

}

return res;

}

void printResult(vector<string> words, vector<pair<char, char>> firstAndLastChar) {

for (int i = 0; i < words.size(); i++) {

printf("%s: %c-%c\n", words[i].c_str(), firstAndLastChar[i].first, firstAndLastChar[i].second);

}

}

int main() {

string str = "The quick brown fox jumps over the lazy dog.";

auto words = splitString(str);

auto firstAndLastChar = getFirstAndLastChar(words);

printResult(words, firstAndLastChar);

return 0;

}

总结

本文针对字符串处理中的一个问题——打印字符串中每个单词的第一个和最后一个字符进行了详细的讲解。我们首先介绍了具体的实现步骤,然后逐个步骤进行讲解并提供了代码实现。通过本文的学习,读者可以对字符串的分割与字符获取有更好的理解与掌握。

后端开发标签