Ⅰ C语言查找替换字符
#include<stdio.h>
#include<配仿conio.h>
#include<string.h>
#include<stdlib.h>
voidSubstitute(char*pInput,char*pOutput,char*pSrc,char*pDst)
{
char*pi,*po,*p;
intnSrcLen,nDstLen,nLen;
//指向输入字符串的游动指针.
pi=pInput;
//指向输出字符串的游动指针.
po=pOutput;
//计算被替换串和替换串的长度.
nSrcLen=strlen(pSrc);
nDstLen=strlen(pDst);
//查找pi指向字符串中第一次出现替换串的位置,并返回指针(找不到则返回null).
p=strstr(pi,pSrc);
if(p)
{
//找到.
while(p)
{
//计算被替换串前边字符串的长度.
nLen=(int)(p-pi);
//复制到输出字符串.
memcpy(po,pi,nLen);
memcpy(po+nLen,pDst,nDstLen);
//跳过被替换串.
pi=p+nSrcLen;
//调整指向输出串的指针位置.
po=po+nLen+nDstLen;
//继续查找.
p=strstr(pi,pSrc);
}
//复制剩余字符串.
strcpy(po,pi);
}
else
{
//没有找到则原样复制.
strcpy(po,pi);
}
}
intmain(intac,char*av[])
{
if(ac!=5){
printf("程序名要操作的文件新文件查找的字符串替换的字符串 ");
printf("示例:test.exe1.txt2.txthellolove ");
return0;
}
constintMAXSIZES=100;
FILE*fpSrc,*fpDes;
charfilename1[20]="1.txt";
charfilename2[20]="2.txt";
//要求查找的字符串,替换的字符串;
charps[]="hello";
charpd[]="love";
//求取所查找和替换的字符串的长度;
intlen_src=strlen(av[3]);
intlen_des=strlen(av[4]);
//定义存储字符串缓冲区;很奇怪的一点是,fgets函数不能将字符串写入动态分配的内存中
/*char*Src_buf=(char*)(sizeof(char)*MAXSIZES);
char*Cpy_buf=(char*)(sizeof(char)*MAXSIZES);
char*Des_buf=(char*)(sizeof(char)*MAXSIZES);*/
charSrc_buf[MAXSIZES]={0};
charCpy_buf[MAXSIZES]={0};
charDes_buf[MAXSIZES]=培耐纤{0};
//打开文件
if((fpSrc=fopen(av[1],"r+"))==NULL)
{
printf("failtoopenthefile1! ");
exit(1);
}
if((fpDes=fopen(av[2],"a+"))==NULL)
{
printf("failtoopenthefile2! ");
exit(1);
}
//进行循环读取
while(!feof(fpSrc))//判断文件是否已结束;!feof(fpSrc)
{
亩胡fgets(Src_buf,MAXSIZES,fpSrc);
Substitute(Src_buf,Des_buf,av[3],av[4]);
fputs(Des_buf,fpDes);
printf("%s",Des_buf);
}
fclose(fpSrc);
fclose(fpDes);
system("pause");
return0;
}
Ⅱ C语言如何实现字符之间的替换(打出一列顺序,输出按此顺序输出)
根据你的题意。
第一行输入是26个字母的指定顺序。
第二行输入是内容字符串。
将内容字符串中的字母按照指定顺序替换成对应26个字母原顺序的字母。
规则:第一行输入必须是26个小写母,且不能重复。
替换后的字符中字母大小写参照原字符串。
下面是代码:
#include<stdio.h>
#include<string.h>
#define MAXLEN 100//第二行输入字符串的最大长度
char *inPutNewOrder();//输入26个字母的新顺序,必须为小写字母,不能有重复。输入成功返回字符串,失败返回NULL
char getNewLetter(char cIn,char newOrder[27]);//获取字母对应newOrder的原始字母,成功返回字母,失败返回0
int main()
{
int i;
char *newOrder;//输入新字母顺序
char inputStr[MAXLEN],cIn;
while(1)
{
newOrder=NULL;
while(!newOrder)
newOrder=inPutNewOrder();
memset(inputStr,0,sizeof(char)*MAXLEN);
for(i=0;i<MAXLEN;i++)
{
cIn=getchar();
if(cIn==10)//回车结束输入
break;
if((cIn>=65 && cIn<=90)||(cIn>=97 && cIn<=122))//如输入的是字母,对应新字母顺序,找到原字母
inputStr[i]=getNewLetter(cIn,newOrder);
else
inputStr[i]=cIn;
}
if(i==MAXLEN)
while ((cIn = getchar()) != EOF && cIn != ' ');
printf("%s ",inputStr);
}
return 0;
}
char *inPutNewOrder()//输入26个字母的新顺序,必须为小写字母,不能有重复
{
int i=0,j,flag=1;
static char newOrder[27];
char c=0;
memset(newOrder,0,sizeof(char)*27);
while(1)
{
if(newOrder[25]!=0)
break;
c=getchar();
if(c<97 || c>122)//输入小写字母以外字符,标识错误
flag=0;
for(j=0;flag && j<i;j++)
if(newOrder[j]==c)//输入重复,标识错误
flag=0;
if(!flag)//错误,终止输入
{
printf("输入格式错误!必须为26个小写字母,且不能有重复,请重新输入。 ");
while ((c = getchar()) != EOF && c != ' ');
return NULL;
}
newOrder[i]=c;
i++;
}
while ((c = getchar()) != EOF && c != ' ');
return newOrder;
}
char getNewLetter(char cIn,char newOrder[27])//获取字母对应newOrder的原始字母,成功返回字母,失败返回0
{
static char letters[]="abcdefghijklmnopqrstuvwxyz";
char c;
int i,flag;//flag=1大写字母,flag=0是小写字母
if(cIn>=65 && cIn<=90)//输入的是大写字母
c=cIn+32,flag=1;
if(cIn>=97 && cIn<=122)//输入的是小写字母
c=cIn,flag=0;
for(i=0;i<26;i++)
if(newOrder[i]==c)//在新序列中匹配大写字母或小写字母
{
if(flag)
return letters[i]-32;
else
return letters[i];
}
return 0;
}