单词查找替换
给定一个由英语单词组成的文本。将其中的某些单词替换成另外的单词。
输入第一行整数t,表示测试数据数目。
对于每组测试数据:
第一行输入一个整数n(0 < n <= 100 )表示需要替换的单词数。
接下来n行,每行输入两个字符串Ai Bi,空格隔开。表示将字符串Ai替换成Bi。
最后一行代表文本,包含若干个字符串,字符串之间空格隔开,字符串数目(<=200),字符串长度(<=20)输出每组测试数据输出一行,表示经过替换之后的文本。样例输入
2 2 coding programming programming coding coding now programming future 4 i I you YOU us US my MY every night in my dreams i see you i feel you that is how i know you go on
样例输出
programming now coding future
every night in MY dreams I see YOU I feel YOU that is how I know YOU go on
思路一:
这一道题可以归结为以下几个词:读入,储存,比较,输出。这里思路1采用了边读入,边比较,边输出的方式。
首先开辟存储数组,包括两个二维字符数组,用来存储要被替换和替换的单词,两个一维字符数组,一个用来存储从句子中截取的单词,一个用来存储句子。
其次是读入,采用scanf读入每组的两个单词,这里需要注明一点:scanf和gets的区别,gets() 和scanf()的区别在于输入的字符串是否中间有空格:对于前者,只有遇到"\n"时才停止输入,而对于后者,出现"\n"或空格都停止输入。
读完这些之后,就用gets把整个句子读入到str里。然后对str的每一个字符进行遍历,这里利用循环变量i和while语句,如果字符是空格,则直接输出。如果是空格之后的第一个字母,则记录这个字母行下标的位置,然后利用两个变量j,k
进行遍历,直到遇到空格也就是读取了一个单词。把这个单词保存在tmpstr中,利用for循环,注意最后要加上tmpstr[j - i] = '\0';
之后是比较,利用found做标签,for循环判断临时存储的单词是否出现在src[200][20]中,如果存在,found=1,break,跳出循环,输出与之对应的dst[200][20];中的元素,else,found=0;输出该临时变量中的单词。
之后继续读入后续的单词,记住,此时应该把i初始化 i = j;。
思路二:
整体读取,把所有单词截取到一个二维字符数组中,然后再开辟一个标记数组,数量与这句话的单词数量一样,对要替换单词和该句单词进行遍历,用两层for循环,替换一个单词后标记一下,以后不用替换了。以此类推,之后把替换后的单词输出。
思路一:样例代码
#include <stdio.h>
#include <string.h>
int main()
{
int t, n;
char src[200][20];
char dst[200][20];
char tmpstr[200];
char str[4500];
scanf("%d", &t);
while (t --)
{
scanf("%d", &n);
int i;
//src数组中存储的是需要被替换的单词
//dst数组中存储的是替换时的目标单词
for ( i = 0; i < n; ++i)
scanf("%s %s", src[i], dst[i]);
getchar();
gets(str);
int found;
i = 0;
//i表示字符串中字符的下标
while (i < strlen(str)) {
if (str[i] == ' ') {
printf("%c", str[i]);
i ++;
} else {
int j = i, k = 0;
//j表示第i个字符之后,第一个空格出现的位置
while (str[j]!=' '/*填空*/ && j < strlen(str)) {
j ++;
}
//将第i个字符(包括)到第j个字符(不包括)之间的单词保存在tmpstr中
for (k = i; k < j; ++ k)
/*填空*/tmpstr[k-i] = str[k];
tmpstr[j - i] = '\0';
found = 0;
//和n个需要被替换的单词对比
for (k = 0; k < n; ++ k) {
if (strcmp(src[k], tmpstr) == 0/*填空*/) {
found = 1;/*填空*/
break;
}
}
if (found==1) {
printf("%s",dst[k]);/*填空*/
} else {
printf("%s", tmpstr);
}
//更新下标 i
i = j;/*填空*/
}
}
printf("\n");
}
return 0;
}