[color=000000][[size=6][size=3][size=1]b]本程序大家不用细心看懂,直接它拷下来在机器上运行就可以了,我觉得问题不在程序本身。[/b][/size][/size][/size][/color]

测试数据:input7.txt
2
I am a student student student
I am a teacher
student
teacher



/*本算法是用类实现,采用kmp算法进行匹配查找*/
#include "iostream"
using namespace std;
#define  MAXLEN 50//字符串的最大长度
#define  MAXNUM 20//字符串的最大个数
class String
{
    int length;
    char strings[MAXLEN];
public:
    String()
    {
        length=0;
        for (int i=0;i<MAXLEN;i++)
        {
            strings[i]=NULL;
        }
    }
    void StringAssign(char *tp)
    {
        int temp=strlen(tp);
        if(tp[temp-1]==10)//由于tp字符串可能没有结束答,可能导致字符串长度出错
           length=temp-1;
        else length=temp;
        strcpy(strings+1,tp);//0单元不赋值
    }
    int Get_len() const
    {
        return length;
    }
    void print()
    {
        char *tp=strings+1;
        cout<<tp;//tp中已有换行符
    }
    friend void Get_next(const String &T,int *next);
    friend int Match(const String &M,const String &T,int *next,int pos);
    friend void Replace(String &M,const String &V,int &pos);
};
 void Get_next(const String &T,int *next)//求next数组值
{
    next[1]=0;
    next[2]=1;
    int j=2, k=1;
    for(;j<=T.length;j++)
    {
        while(T.strings[j]!=T.strings[k]&&k)
            k=next[k];
        next[j+1]=k+1;
        k=next[j+1];
    }
}
 int Match(const String &M,const String &T,int *next,int pos)//kmp算法
{
   int i=pos,j=1;
   while (i<=M.length&&j<=T.length)
   {
       if(j==0||M.strings[i]==T.strings[j]) {i++;j++;}
       else j=next[j];
   }
   if(j>T.length) return i-T.length;//返回插入的位置
   else return 0;
}
 void Replace(String &M,const String &V,int &pos)//用V替换M中的T子串
 {
     for(int i=1;i<=V.length;i++)
         M.strings[i+pos-1]=V.strings[i];
 }
int main()
{
    FILE *fp;
    if (fp=fopen("input7.txt","r"))
    {    
        int num=0;//字符主串个数 
        fscanf(fp,"%d",&num);
        char temp[MAXLEN];//读入整数后面的空格字符
        fgets(temp,MAXLEN,fp);//这种情况只在不同输入格式时存在
        String *str=new(String[num]);         
        char *tp=new char[MAXLEN];
        for (int i=0;i<num;i++)//读入n个字符串
        {
           fgets(tp,MAXLEN,fp);
           str[i].StringAssign(tp);
        }
        String T,V;//读入T,V子串
        fgets(tp,MAXLEN,fp);
        T.StringAssign(tp);
        int len=T.Get_len();
        int *next=new int[len];
        if(len>1)
           Get_next(T,next);//求数组next值
        else next[1]=0;
        fgets(tp,MAXLEN,fp);
        V.StringAssign(tp);
        delete tp;//释放空间
        for(i=0;i<num;i++)//替换各子串存在的T子串
        {
            int flag[MAXLEN]={1,};
            flag[1]=Match(str[i],T,next,1);//找到替换位置
            for(int j=flag[1]+T.Get_len(),k=2;j<=str[i].Get_len()&&k<=str[i].Get_len()+1;k++)
            {//将主串中的所有T子串中替换掉
                if(!flag[1]) 
                {
                    cout<<flag[1]<<endl;
                    j=str[i].Get_len()+1;
                } 
                else
                {
                    Replace(str[i],V,flag[k-1]);
                    flag[k]=Match(str[i],T,next,j);                    
                    j=flag[k]+T.Get_len();
                }
            }
           if (flag[1])
           {
                Replace(str[i],V,flag[k-1]);
                   str[i].print();          
           }              
        }
        delete []str;
        //delete []next;这个问题我不能解释        
        fclose(fp);
    }
    return 0;
}[em8][em10][em5][em5][em5][em5][em5][em5][em5][em5]