首页 > 专题系列 > C基础练习 > C语言程序设计-字符串替换[函数应用]
2013
11-19

C语言程序设计-字符串替换[函数应用]

10054 字符串替换

【问题描述】将一段英文文章中字符串用给定的字符串替换。

【输入形式】输入包括多行,每一行为一段英文文章(长度不超过80)。以后每行包括2个字符串(长度不超过20),之间由空格分隔,第一个串为原串,第二个串为替换串,当遇到0 0两个串时表示输入结束,并且此行不需处理。注意:本题需要考虑原串和替换串的长度不同的三种情况。情况1:原串的长度大于替换串,如原串为are ,替换串为is。情况2:原串的长度等于替换串,如原串为h ,替换串为H。情况3:原串的长度小替换串,如原串为yes ,替换串为your。

【输出形式】输出替换后的文章。

【样例输入】

hello how are yes.
h H
es ou
0 0

【样例输出】

Hello How are you.

【评分标准】本题共4个测试点,每个测试点0.25分,总分1.0分。

方法一:C语言

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char str[150];
char g1[30],g2[30];
int len1,len2,len3;
//查找字符串g 在str中的开始位置 (从start开始找)
int find(char str[150], char g[30], int start)
{
	for(int i=start; i<len1; i++){
		int j=0;
		while(i+j < len1 && str[i+j]==g[j]) j++;
		if(j == len2) return i;
	}
	return -1;
}
int main() {
	//freopen("in.txt","r" ,stdin);
	gets(str);
	len1 = strlen(str);
	while(true){
		scanf("%s %s", g1,g2);
		len2 = strlen(g1);
		len3 = strlen(g2);
		int start = 0; //匹配到的开始的位置
		//替换所有,直到start=-1,表示替换完毕
		while( (start = find(str,g1, start)) != -1){
			int offset = len3 - len2;
			len1 += offset;
			//根据偏移量,向前或向后移
			if(offset > 0)
				for(int j=len1-1; j>= start+len2; j--) str[j] = str[j-offset];
			else if(offset < 0)
				for(int j=start+len3; j<len1; j++) str[j] = str[j-offset];
			//替换
			for(int i=start; i<start+len3; i++)
				str[i] = g2[i-start];

			str[len1] = 0;//最后一位结束符号
			start += len3; //开始位置 加上自身长度
			if(start > len1) break;
		}
		if(g1[0] == '0' && g2[0]=='0') break;//读到0结束替换
	}
	printf("%s\n",str);
	return 0;
}

方法二:调用库函数实现

#include<stdio.h>
#include<string.h>
void swap(char text[],char a[],char b[])
{
	char *str=text,back[20];
	while((str=strstr(str,a))!=NULL)
	{
		strcpy(back,str+strlen(a));
		*str=0;
		strcat(text,b);
		strcat(text,back);
		str+=strlen(b);
	}
}
int main()
{
	char text[80],a[20],b[20];
	gets(text);
	while(1)
	{
		scanf("%s",a);
		scanf("%s",b);
		if(strcmp(a,"0")==0&&strcmp(b,"0")==0)
		break;
		swap(text,a,b);
	}
	puts(text);
	return 0;
}

 


  1. Gucci New Fall Arrivals

    This is really nice to know. I hope it will be successful in the future. Good job on this and keep up the good work.

  2. 很高兴你会喜欢这个网站。目前还没有一个开发团队,网站是我一个人在维护,都是用的开源系统,也没有太多需要开发的部分,主要是内容整理。非常感谢你的关注。