算法笔记练习 3.6 字符串处理 问题 D: 单词替换
题目
题目描述
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入
多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格。
输出
每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。
样例输入
I love Tian Qin
I
You
样例输出
You love Tian Qin
思路
- input,find,replace 分别接收字符串 s,单词 a,单词 b
- 把 input 的数据写入二维字符数组 words,使得 words 的每一行代表 input 中的一个单词
- 在 words 中进行单词的查找替换
- 输出 words 作为最终结果
细节:
在第 2 步中顺便用变量 cnt 来统计单词总数,方便后续操作。
代码
#include <stdio.h>
#include <string.h>
#define MAX 110
int main(){
int cnt, i;
char *pinput, *pwords;
// input,find,replace 分别接收三行数据
// words 以二维数组形式存放 input,每一行为一个单词
char input[MAX], words[MAX][MAX], find[MAX], replace[MAX];
while (gets(input)){
gets(find);
gets(replace);
// 将 input 中的数据放入 words
// cnt 用来统计 input 中单词数量
cnt = 0;
pinput = input;
pwords = &words[0][0];
while (*pinput){
while (*pinput != ' ' && *pinput != '\0'){
*pwords = *pinput;
++pinput;
++pwords;
}
*pwords = '\0';
pwords = &words[++cnt][0];
if (*pinput == ' ')
++pinput;
}
// 遍历 words 中的单词,进行查找替换
for (i = 0; i < cnt; ++i)
if (!strcmp(words[i], find))
strcpy(words[i], replace);
// 根据 words 输出结果
// flag 标志是否已输出第一个单词
int flag = 0;
for (i = 0; i < cnt; ++i){
if (flag)
putchar(' ');
printf("%s", words[i]);
flag = 1;
}
putchar('\n');
}
return 0;
}