输入两个字符串,从第一个字符串中删除第二个字符串中的字符

题目:

输入两个字符串,从第一个字符串中删除第二个字符串中的所有字符
比如输入第一个字符串:“They are students."
             第二个字符串: "aeiou"
删除之后的第一个字符串变成"The r stdnts."


题目分析(思路):

创建三个string类对象 第一个s1第二个str2为题目要求的字符串

第三个str3则用来接收最后需要输出的字符串 

循环遍历上面两个字符串 str1 str2

如果str1中出现了str2中的任何一个则跳过看下一个字符 然后将str1中的下一个字符再与str2中的字符进行一一比较

以此类推 相同跳过 str1中没有一个与str2中的字符相同则压入str3中


代码展示:

#include <iostream>
#include <string>
using namespace std;

int main() {
	string str1;
	string str2;
	string str3;
	char n=0,m=0;
	while (1) {
		n = getchar();
		if (n == '\n') {
			break;
		}
		str1.push_back(n);
	}
	while (1) {
		m = getchar();
		if (m == '\n') {
			break;
		}
		str2.push_back(m);
	}
	bool sign = true;
	string::iterator it1 = str1.begin();
	string::iterator it2;
	for (it1;it1 != str1.end();++it1) {
		for (it2=str2.begin();it2 != str2.end();++it2) {
			if (*it1 == *it2) {
				sign = false;
				break;
			}
		}
		if (sign==true){
			str3.push_back(*it1);
		}
		sign = true;
	}
	cout << str3.c_str() << endl;
		system("pause");
		return 0;
}

部分代码分析:

while (1) {
		n = getchar();
		if (n == '\n') {
			break;
		}
		str1.push_back(n);
	}

这段代码 ↑ 是输入一个字符串str

bool sign = true;
	string::iterator it1 = str1.begin();
	string::iterator it2;
	for (it1;it1 != str1.end();++it1) {
		for (it2=str2.begin();it2 != str2.end();++it2) {
			if (*it1 == *it2) {
				sign = false;
				break;
			}
		}
		if (sign==true){
			str3.push_back(*it1);
		}
		sign = true;
	}

这段代码 ↑ 应该是解这个题目的关键核心

巧妙之处在于定义了一个bool变量 用来标记字符串str2中的其中一字符是否与str1中的其中一个字符相同

相同则标记为false 然后跳出循环 进行str1中下一个字符的判断 以此类推

需要注意的是 在压入str3后 要将标记sign重新置为true

否则上面一步sign被置为false  如果str1中下一个字符与str2中字符没有一个相同 那么也不会被压入str3中


版权声明:本文为qq_41359293原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。