NOI-OJ 1.7 ID:21 单词替换

整体思路

  • 本题如果使用scanf每次读入一个单词、比对替换后再进行输出的话就十分简单,使用这种方法必须要用数组把读入的所有单词存起来,读入的count个单词的前n-2个是原文,第n-1个是查找的单词,第n个是替换值。

  • 如果要求设计一个函数replace(原文,被替换单词,替换值),这就稍有些难度,但这样的设计训练是有意义的,因为replace函数是在各种程序设计语言中常用的字符串处理函数,理解其工作原理十分重要。基本思路:

    1. 从0开始依次处理原文每一个字符
    2. 从该位置开始使用strncmp和被替换单词进行对比,并且对该部分的有效性进行判断,判断方法见代码。对比成功且有效则输出替换值,修改位置坐标为当前位置+被替换单词长度后重复第2步。
    3. 第2步对比或有效性判断不成功,则直接输出该字符,当前位置+1,回到第2步
  • 本题提供两个例程用于参考:

例程1:设计replace函数

#include<iostream>
#include<cstring>
using namespace std;
void replace(char S[], char A[], char B[]);			//replace函数声明
int main(){											//主函数十分清晰
	char s[101], a[101], b[101];
	gets(s);
	gets(a);
	gets(b);
	replace(s, a, b);
	return 0;
}
void replace(char S[], char A[], char B[]){			//注意形参的写法
	int lenS=strlen(S);
	int lenA=strlen(A);
	int lenB=strlen(B);
	int i=0;
	while(i<lenS){	//有效性原则——头:下标为0或前一个字符为空格,尾:原文[下标+lenA]为结束符或空格
		if(strncmp(S+i, A, lenA)==0 && (i==0 || S[i-1]==' ') && (S[i+lenA]=='\0' || S[i+lenA]==' ')){
			printf("%s", B);
			i+=lenA;
		}else{
			printf("%c", S[i]);
			i++;
		}
	}
}

例程2:数组存储

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	char t[200][200];							//二维数组,可容纳200行长度为199的字符串
	int  n=0; 
	while(scanf("%s", t[++n])!=EOF)  ;			//下标从1开始便于引用,注意这里二维数组的使用
												//t[n]代表第n行字符串的首地址,故前面不用加“&”
	n--;										//最后一次读取是失败的,所以n要减一  
	for(int i=1; i<=n-2; i++){
		if(strcmp(t[i], t[n-1])==0)
			printf((i==1)?"%s":" %s", t[n]);	//用三元运算符控制输出格式,第一次输出单词 
		else									//以后每次输出空格+单词 
			printf((i==1)?"%s":" %s", t[i]);
	}
	return 0;
}
posted @ 2017-04-12 10:59  LFYZOI题解  阅读(1983)  评论(0编辑  收藏  举报