单词查找替换

给定一个由英语单词组成的文本。将其中的某些单词替换成另外的单词。

输入第一行整数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;
}
















posted @ 2017-04-23 17:18  visionshao  阅读(1065)  评论(0编辑  收藏  举报