介绍
在计算机科学中,字符串(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;
}
总结
本文针对字符串处理中的一个问题——打印字符串中每个单词的第一个和最后一个字符进行了详细的讲解。我们首先介绍了具体的实现步骤,然后逐个步骤进行讲解并提供了代码实现。通过本文的学习,读者可以对字符串的分割与字符获取有更好的理解与掌握。