字符串处理专题

codeup习题

文章目录

  • codeup习题
    • Problem A: 字符串连接
    • Problem B: 首字母大写
    • Problem C: 字符串的查找删除 ※
    • Problem D:单词替换 ※
    • Problem E: 字符串去特定字符
    • Problem F:数组逆置
    • Problem G:比较字符串
    • Problem H:编排字符串

Problem A: 字符串连接

要求不使用库函数把两个字符串连接并输出。
非常简单。

#include
int main(){
	char str1[110],str2[110];
	while(scanf("%s%s",str1,str2)!=EOF){
		int num1,num2;
		num1=num2=0;
		while(str1[num1]!='\0')num1++;
		while(str2[num2]!='\0')num2++;
		int i,j;
		for(i=num1,j=0;j<num2;i++,j++){
			str1[i]=str2[j];
		}
		str1[i]='\0';
		printf("%s\n",str1);
	}
	return 0;
}

Problem B: 首字母大写

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。
在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)。
注意如果首字母本身就是大写则无需转变,另题意表达不清,实际上只有’ '和‘\t’两种类型。

#include
#include
using namespace std;
int main(){
	char str[100];
	while(cin.getline(str,100)){
		int len=strlen(str);
		for(int i=0;i<len;i++){
			if(i==0&&(str[i]>='a'&&str[i]<='z')){
				str[i]+='A'-'a';
			}
			if((str[i]==' '||str[i]=='\t')&&(str[i+1]>='a'&&str[i+1]<='z')){
				str[i+1]+='A'-'a';
			}
		}
		cout<<str<<endl;
	}

	return 0;
}

Problem C: 字符串的查找删除 ※

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
删除输入的短字符串(不区分大小写)并去掉空格,输出。
这道题就是用简单模式匹配来做,要注意的是,首先不区分大小写,因此先把短字符串转换为小写字母,但长字符串输出的时候要求大小写和输入一样,因此用一个tmp来存储转换为小写之后的字符用以比较。

#include
#include
using namespace std;
int main(){
	char s[110];
	char str[110][110];
	gets(s);
	int i;
	for(i=0;s[i]!='\0';i++){
		if(s[i]>='A'&&s[i]<='Z')
			s[i]+='a'-'A';
	}
	i=0;
	char tmp;
	int j,k,t;
	while(gets(str[i])){
		for(j=0;str[i][j]!='\0';j++){
			for(t=j,k=0;s[k]!='\0';t++,k++){
				if(str[i][t]>='A'&&str[i][t]<='Z'){
					tmp=str[i][t]+'a'-'A';
				}
				else
					tmp=str[i][t];
				if(tmp!=s[k])
					break;
			}
			if(s[k]=='\0'){
				j+=strlen(s)-1;
			}
			else if(str[i][j]!=' ')
				putchar(str[i][j]);
		}
		cout<<endl;
		i++;
	}
	return 0;
}

Problem D:单词替换 ※

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格。

这道题的测试用例没有考虑例如a只是出现在一个单词中的情况,而是简化为只要出现a就替换为b。实现上要简单很多。

#include
#include
using namespace std;
int main(){
	string str;
	string a;
	string b;
	int t;
	while(getline(cin,str)){
		cin>>a;
		cin>>b;
		t=0;
		while(str.find(a,t)!=string::npos){//检测字符串中所有欲查找的目标字符串
			t=str.find(a,t);
			str.replace(t,a.length(),b);
			t+=a.length();//这里用t++会导致内存超限
		}
		cout<<str<<endl;
		getchar();//注意在使用cin之后使用getline(sin,str)时要用getchar()吸收回车
	}
	return 0;
}

从网上找到的第二种方法,进行字符串的简单模式匹配,如果找到待替换字符串a,则输出b并在主串中跳过待替换字符串的长度;若未找到,则输出当前字符。

#include
#include
using namespace std;
int main(){
	char str[110];
	char a[110],b[110];
	int i,j,k;
	while(gets(str)){
		gets(a);
		gets(b);
		for(i=0;str[i]!='\0';i++){
			for(k=i,j=0;a[j]!='\0';k++,j++){
				if(str[k]!=a[j]){
					break;
				}
			}
			if(a[j]=='\0'){//若匹配成功,则跳过a输出b
				cout<<b;
				i+=strlen(a)-1;//注意for循环最后i会自增一,这里提前减去
			}
			else//若匹配不成功,则输出当前字符
				putchar(str[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem E: 字符串去特定字符

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。
此题目注意两点:一是字符串s可能含有空格,二是用printf输出空格需用getchar()吸收(gets()识别换行符作为结束标志)。

#include
#include
using namespace std;
int main(){
	char a[100];
	char c;
	int i,j;
	while(gets(a)){
		scanf("%c",&c);
		for(i=0;a[i]!='\0';){
			if(c==a[i]){
				for(j=i;a[j+1]!='\0';j++){
					a[j]=a[j+1];
				}
				a[j]='\0';
			}
			if(a[i]!=c){
				i++;
			}
		}
		printf("%s\n",a);
		//此处若不用getchar()吸收换行,则会被gets()识别导致出错
		getchar();
	}
	return 0;
}

Problem F:数组逆置

输入一个字符串,长度小于等于200,然后将数组逆置输出。
最简单的一个题。

#include
int main(){
	char a[300];
	int i;
	while(gets(a)){
		for(i=0;a[i]!='\0';i++);//求字符串长度
		i--;
		for(;i>=0;i--){
			printf("%c",a[i]);
		}
		printf("\n");
	}
	return 0;
}

Problem G:比较字符串

比较两个字符串长度。非常简单。

#include
int main(){
	int m;
	scanf("%d",&m);
	char a[60];
	char b[60];
	int i,j;
	while(m--){
		scanf("%s%s",a,b);
		for(i=0;a[i]!='\0';i++);
		for(j=0;b[j]!='\0';j++);
		if(i>j)
			printf("%s is longer than %s\n",a,b);
		else if(i<j)
			printf("%s is shorter than %s\n",a,b);
		else
			printf("%s is equal long to %s\n",a,b);
	}
	return 0;
}

Problem H:编排字符串

输入m个字符串,要求后输入的字符串排在前面,最多显示4 个字符串。
这道题直接用一个字符串数组每次读入字符串之后记录当前位置,再倒着往前输出直到达到四个字符串或者输出了所有输入的字符串为止。

#include
int main(){
	int m;
	scanf("%d",&m);
	int i,j,t;
	char a[120][30];
	for(i=0;i<m;i++){
		t=i;
		scanf("%s",a[i]);
		for(j=0;j<=i&&j<4;j++){
			printf("%d=%s",j+1,a[t]);
			t--;
			if(j==i||j==3)
				printf("\n");
			else
				printf(" ");
		}
	}
	return 0;
}

你可能感兴趣的:(算法笔记)