问题D:单词替换
时间限制 : 1.000 sec 内存限制 : 32 MB
题目描述
输入一个字符串,以回车结束(字符串长度<=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
解题思路
- 将原字符串s逐个字符赋值给字符串c,同时从原字符串中取出要替换的字符串a大小的临时字符串temp,并与要替换的字符串a比较。
- 如果相同,则将替换字符串b逐个字符添加到c中,并改变循环变量i的值使得下一轮循环i指向s中a后的下一个字符。
AC代码
#include <cstdio>
#include <cstring>
int main() {
// s为原字符串,a为要替换的字符串,b为替换字符串
// c为输出字符串,temp为临时字符串
char s[100], a[100], b[100], c[100], temp[100];
while (gets(s), gets(a), gets(b)) {
int c_i = 0;
for (int i = 0; i < strlen(s); ++i) {
int t = 0;
// 从s中取a大小的字符串给temp赋值
for (int j = i; j < strlen(a) + i; ++j) {
temp[t++] = s[j];
}
temp[t] = '\0';
// 将s中的字符逐个赋值给c,当temp与a相等时,将b中的字符逐个添加到c中
// 将temp与a比较
if (strcmp(temp, a) == 0) {
// 相等则将b中字符逐个添加到c中
for (int j = 0; j < strlen(b); ++j) {
c[c_i++] = b[j];
}
// 因为i会自动加1,故将i的值往后挪stelen(a)-1的长度
// 则下一轮循环时i指向s中a字符串后的下一个字符
i += strlen(a) - 1;
} else {
// 不相等则将s中字符添加到c中
c[c_i++] = s[i];
}
}
c[c_i] = '\0';
printf("%s\n", c);
}
return 0;
}
经验总结
一开始并没有注意到要改变i的值,这样的话当要替换的字符串a的长度大于1时就会只替换1个字符。