除去英文句子中的数字、空格和标点符号
题目:一个英文句子,句子中仅包含英文字母,数字,空格和标点符号,其中数字、空格和标点符号将句子划分成一个个独立的单词,除去句子中的数字、空格和标点符号,将句子中的每个单词的首字母大写,然后输出句子,输出时各个单词之间以一个空格隔开,句子以“.”结束
输入样例 1
Who love?, Solo..
输出样例 1
Who Love Solo.
输入样例 2
----Who,love???Solo
输出样例 2
Who Love Solo.
输入样例 3
66666666664123+Who-32didn't love? Solo32..
输出样例 3
Who Didn T Love Solo.
#include<iostream>
#include<string>
using std::endl;
using std::cin;
using std::cout;
using std::string;
bool IsLetter(char character) {
if (character >= 'a' && character <= 'z') {
return true;
}
if (character >= 'A' && character <= 'Z') {
return true;
}
return false;
}
int FindTheLastLetterPosition(string input, int startPosition) { //传值时已经确保startPosition下标的值是字母
for (int i = startPosition; i < input.length(); i++) {
if (!IsLetter(input[i])) { //找到第一个不是字母的字符,返回其下标
return i; //下标为i的值不是字母
}
}
return input.length();
}
void outputstring(string input, int startPosition, int lastPosition) {
cout << (char)toupper(input[startPosition]);
for (int i = startPosition + 1; i < lastPosition; i++) {
cout << input[i];
}
}
int main()
{
string input;
bool flage=false;
getline(cin, input);
for (int i = 0; i < input.length(); i++) {
if (IsLetter(input[i])) {
if (flage) {
cout << " ";
}
flage = true;
int lastPosition = FindTheLastLetterPosition(input, i);
outputstring(input, i, lastPosition);
i = lastPosition;
}
}
cout << "." << endl;
return 0;
}
从前往后找,找到第一个字母,记录下标。然后调用函数FindTheLastLetterPosition()
找出这个字母后的第一个非字母的下标lastPosition
。输出这两个下标之间的字符就是第一个单词了,然后继续从lastPosition + 1
开始找,直到找到字符串末尾。
至于第一个字母大写,有现成函数直接转换就好了。还有输出是单词以空格分隔,以‘.’
结尾,这个可以自己思考一下,我也想了半个多小时。还是蛮有意思的