除去英文句子中的数字、空格和标点符号

        题目:一个英文句子,句子中仅包含英文字母,数字,空格和标点符号,其中数字、空格和标点符号将句子划分成一个个独立的单词,除去句子中的数字、空格和标点符号,将句子中的每个单词的首字母大写,然后输出句子,输出时各个单词之间以一个空格隔开,句子以“.”结束

输入样例 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
#include

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开始找,直到找到字符串末尾。

        至于第一个字母大写,有现成函数直接转换就好了。还有输出是单词以空格分隔,以‘.’结尾,这个可以自己思考一下,我也想了半个多小时。还是蛮有意思的

你可能感兴趣的:(c++,编程)