请各位大侠帮忙写个程序~~

bbatvv 2010-01-09 09:13:48
我的小学期大作业,老师很变态,出的很难,求助各位达人.用vc++做~~
课题:
串的查找和替换
要求:打开一篇英文文章,在该文章中找出所有给定的单词,
对所有给定的单词替换为另外一个单词,再存盘。
...全文
134 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
die_angle 2010-01-09
  • 打赏
  • 举报
回复
/*我是课代表收了他们的程序,这个给你吧*/


#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW 0
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct{
char *ch;
int length;
}HString;
void printfun(HString *T){
if(!(int)(T->ch)) printf("我是空地址!!请先给我赋地址!!\n");
else
printf("%d,%s\n",T->length,T->ch);
}
void IniString (HString *T){
//初始化
T->ch=NULL;
T->length=0;
}

Status StrAssign(HString *T,char *chars){//生成一个值等于常量chars的串t
int i;
char *c;
if(T->ch) free(T->ch);//释放原有空间
for(i=0,c=chars;*c;++i,++c);//求char长度i
if(!i){T->ch=NULL;T->length=0;}
else{
if(!(T->ch=(char*)malloc(i*sizeof(char))))
exit(OVERFLOW);
T->ch=chars;

T->length=i;
}
return OK;
}//strassign
HString * StrCopy(HString S,HString *T){
//由串s复制得串t
T=(HString *)malloc(sizeof(S));
//rintf("iam in line 39!!@\n");
if(!T) {
return ERROR;
}
else{
T->ch=(char *)malloc(sizeof(S.ch));
T->ch=S.ch;
T->length=S.length;
}
return T;
}
int StrLength(HString S){
//返回元素的个数,称为串的长度
return S.length;
}//strlength
int StrCompare(HString S,HString T){
//若s>t则返回值大于零,若相等则返回值等于零,否则返回只小于零
int i;
for(i=0;i<S.length&&i<T.length;i++)
if(S.ch[i]!=T.ch[i])return S.ch[i]-T.ch[i];
return S.length-T.length;
}//Strcompare
Status ClearString(HString *S){
//将s清为空串
if(S->ch){free(S->ch);S->ch=NULL;}
S->length=0;
return OK;
}//ClearString
Status Concat(HString *T,HString S1,HString S2){
//用t返回由s1和s2联结而成的新串
int i;
char *P;
char *q;
if(T->ch) {
printf("i will be empty!!\n");
free(T->ch);//释放旧空间
T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
}
if(!(T->ch))
{
printf("the address of t is wrong!!\n");
exit(OVERFLOW);
}
P=T->ch;
q=S1.ch;
for(i=0;i<S1.length;i++,P++,q++)
*P=*q;
*P=0;
q=S2.ch;
for(i=0;i<S2.length;i++,P++,q++)
*P=*q;
*P=0;
T->length=S1.length+S2.length;
return OK;
}//Concat
Status SubString(HString *Sub,HString S,int pos,int len){
//用sub返回串的pos ge 字符起长度为len的子串
//其中,1<=pos<=StrLength(S)且0<=len<=StrLength(S)-pos+1.
int i;
if(pos<1||pos>S.length||len<0||len>S.length-pos+1||(int)(&pos)<48||(int)(&pos)>95||(int)(&len)<48||(int)(&len)>95){
printf("输入数值有错误!返回值将为空!\n");
return ERROR;}
if(Sub->ch) free(Sub->ch);//释放旧空间
if(!len){Sub->ch=NULL;Sub->length=0;}//空子串
else{//完整子串
Sub->ch=(char *)malloc(len*sizeof(char));
for(i=0;i<len;i++)
Sub->ch[i]=S.ch[pos-1+i];
Sub->ch[i]=0;

printf("%s!!!!\n",Sub->ch);
Sub->length=len;
}
return OK;
}//SubString
void get_next(HString T,int next[]){
//求模式串t的next函数值并存如数组next
int i,j;
i=0;
next[0]=-1; j=-1;
while(i<T.length){
if(j==-1||T.ch[i]==T.ch[j]) {++i; ++j; next[i]=j;}

else j=next[j];
}
}//get_next
int Index_KMP(HString S,HString T,int pos,int next[]){
//利用模式串t、的next函数求t在主串中第pos个字符之后的位
//置的kmp算法。其中,t非空,0<=pos<=strlength(s)-1
int i,j;
i=pos-1; j=-1;
while(i<S.length&&j<T.length){
if(j==-1||S.ch[i]==T.ch[j]) {++i; ++j;}//继续比较后继字符
else j=next[j];//模式串向右移动
}
if(j==T.length) return i-T.length+1;
else return -1;
}//Index_KMP
void main()
{
int i,j,pos;
char *a,*b,*c;
int next[100];
HString T;
HString *S;
HString *S1;
HString *Sub;
c=(char *)malloc(sizeof(char));
S1=(HString *)malloc(sizeof(HString));
S=(HString *)malloc(sizeof(HString));
Sub=(HString *)malloc(sizeof(HString));
a=(char *)malloc(100*sizeof(char));
b=(char *)malloc(100*sizeof(char));
printf("*********************测试初始化、赋值:*********************\n");
IniString (&T);
printf("\n初始化后 T is %s,%d\n",T.ch,T.length);
IniString (S);
printf("\n初始化后 S is %s,%d\n",S->ch,S->length);
IniString (S1);
printf("\n初始化后 S1 is %s,%d\n",S1->ch,S1->length);
IniString (Sub);
printf("\n初始化后 Sub is %s,%d\n",Sub->ch,Sub->length);
printf("\n请输入要给T赋予的字符串a:");
scanf("%s",a);
StrAssign(&T,a);
printf("\nT赋值后是:%d,%s\n",T.length,T.ch);
printf("\n请输入要赋予S的字符串b:");
scanf("%s",b);
StrAssign(S,b);
printf("S 赋值后是:%d,%s\n",S->length,S->ch);
printf("\n");
printf("*************************测试复制、求长度、比较*************************\n");
S1=StrCopy(T,S1);
printf("\nT是:%d个字符的字符串,%s\n",T.length,T.ch);
printf("\n把T复制给S1后S1为:%s,%d\n",S1->ch,S1->length);
printf("\n用StrLength求S1长度为%d\n",StrLength(*S1));
printf("S与T比较得:%d\n",StrCompare(*S,T));
printf("\n");
printf("*************************测试连接**************************\n");
printf("\n连接前T是:%d长的字符串,%s\n",T.length,T.ch);
printf("\n连接前S是:%d长的字符串,%s\n",S->length,S->ch);
Concat(S,T,T);
printf("把两个T连接并由S返回连接后的串,S是%d长的字符串,%s\n",S->length,S->ch);
printf("\n");
printf("*************************测试求子串********************\n");
printf("\nT是%s\n\n请输入要在T中第?几个字符后取几?个字符(!!!注意输入的两个数之间要用逗号隔开):",T.ch);
scanf("%d,%d",&i,&j);
SubString(Sub,T,i,j);
printf("\n符合要求的T的子串是%s,长度是%d\n",Sub->ch,Sub->length);
printf("\n");
printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!测试与子串的匹配算法KMP算法!!!!!!!!!!\n");
get_next(T,next);
printf("\n输出子串T的next函数值:\n");
for(i=0;i<T.length;i++)
printf("\n第%d个字符的next函数值是%d\n",i+1,next[i]);
printf("\n请输入要求主串T多少个?字符之后与匹配串S相匹配的子串的起始位置:");
scanf("%d",&pos);
printf("\n未匹配前S是%s\n",S->ch);
printf("\n未匹配前T是%s\n",T.ch);
printf("\nT从S的%d个字符开始可取得与其长度相等的匹配串。\n",Index_KMP(*S,T,pos,next));
ClearString(S);
printfun(S);
//printf("%s,%d\n",S->ch,S->ch);
printf("i am ok!!\n");
}

2010-01-09
  • 打赏
  • 举报
回复
摘自 stlchina.org :
void string_replace(string & strBig, const string & strsrc, const string &strdst) {
string::size_type pos=0;
string::size_type srclen=strsrc.size();
string::size_type dstlen=strdst.size();
while( (pos=strBig.find(strsrc, pos)) != string::npos){
strBig.replace(pos, srclen, strdst);
pos += dstlen;
}
}
Qlaiaqu 2010-01-09
  • 打赏
  • 举报
回复
这是个纯算法问题,字符串匹配km算法算是最最好的性能了,一般的算法书上面都有介绍,lz随便百度一下应该能找到一大片。
这里添个链接:http://baike.baidu.com/view/739278.htm?fr=ala0_1
jinjinClouded 2010-01-09
  • 打赏
  • 举报
回复
楼主 这是很简单滴字符串操作程序 你随便百度一下 很多滴
z569362161 2010-01-09
  • 打赏
  • 举报
回复
出的很难-------用vc++做

1.这是最基础的小程序了,难千万别加很。一点也不很。

2。两个月前用过VC。现在不用了,没办法,不能替你写了。SORRY!
liao05050075 2010-01-09
  • 打赏
  • 举报
回复
搜索一下“AC自动机”

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧