【PAT乙级1033】——旧键盘打字

思路:
err串用于存放坏键,input串存放待输入串;
遍历err串,在遍历一个err串时,同时遍历input串,看是input串是否含有err串的字符,如果有则用特殊字符替换(这里我使用'*'替换),整个遍历完成后,遍历输出input串,遇到'*'就不输出!

看了解析后,解析思路:
利用string类型find()函数,只需遍历input串,如果input[i]err串中,则不输出,否则输出;

代码如下,两个思想都写在了里面,注释了解析思路,提交使用g++

#include
using namespace std;

int main()
{
	string err, input;
	int lenErr, lenInput;
	int count = 0;

	getline(cin, err);
	getline(cin, input);
		
	lenErr = err.length();
	lenInput = input.length();
	/*解析思路*/
//	for(int i=0; i
//	{
//		if(err.find(toupper(input[i]))!=string::npos) continue;
//		if(isupper(input[i])&&err.find('+')!=string::npos) continue;
//		printf("%c", input[i]);
//	}
	/*自己的思路*/
	for(int i=0; i<lenErr; i++)
	{
		for(int j=0; j<lenInput; j++)
		{
			if((err[i]=='_'||err[i]==','||err[i]=='.'||err[i]=='-'||isdigit(err[i]))
				&&err[i]==input[j])
			{
				input[j] = '*';
			}
			if(err[i]==toupper(input[j]))
			{
				input[j] = '*';
			}			
			if(err[i]=='+'&&isupper(input[j]))
			{			
				input[j] = '*';					
			}					
		}	
	} 
	//这两个 for 循环加下面控制输出代码,等价最上面注释的一个 for 循环 
	
	count=0;
	for(int i=0; i<lenInput; i++)
	{
		if(input[i]=='*')
			count++;
	}
	if(count==lenInput)
		printf("\n");
	else
	{
		for(int i=0; i<lenInput; i++)
		{
			if(input[i]!='*')
				printf("%c", input[i]); 
		}
	}
	
	return 0;
}

【Debug过程】:自己的逻辑没有问题,问题出在输入上,以后记住:如果题目输入多行string,最好用getline( cin, string);
【补漏】:string类find()与 string::npos的用法,find不仅可以判断单个字符,也可以判断字符串是否为比较字符的子串,同时还可以设定判断起始位置!另外字符串可以直接比较,比较规则为【字典序】,像Q1028人口普查题,判断出生年月日是否在规定范围内,直接>=和<=比较即可;
【补漏】:ctype库中好用的函数有:is系列(isalnum, isalpha, islower, isupper, isdigit); to系列(toupper, tolower)
ctype文件包含库函数简单明了版:
https://blog.csdn.net/zhouhongkai06/article/details/79050856

你可能感兴趣的:(PAT乙级)