<span id="_xhe_cursor"></span><span id="_xhe_temp" width="0" height="0" />// 版权所有 (C)2007, ***(成都)有限公司。 // // 描述: //作业4.3:文本字符串替换 //文本字符串替换工具(程序名为:repstr),将指定文件中的指定单词(单词以空格分隔)替换成指定的单词,写入一个新文件 //要求: //1、假定目前可供动态分配的内存有限(我们规定为1k char array_ch[1024])的情况下完成 //2、假定单个单词的长度不超过1k,如存在超过1k的单词似为文件格式有误 //3、编码设计需要考虑程序的工作效率,同时考虑对可能出现的异常情况进行判断 //4、程序支持指定参数形式,可判断给出参数的合法性 //repstr.exe <原文件> //<原串> <目标串> <目标文件> //5、需要注意代码的规范化 //6、功能函数的合理划分,将大量重用或功能单一的功能函数化 //7、可先实现等长单词的替换,然后实现不等长单词的替换 //8、禁止使用fgetc、fputc、fgets、fputs函数实现 // // 作者:陈进宇 chenjinyu_china@yeah.net // 日期:2009/3/5 //思路:把预匹配单词前的字符串拷贝到另一个数组里,在把替换单词拷贝过去,最后把替换单词后的字符串拷贝过去 //遇到的问题:数组越界。c++没有数组越界的机制,只有程序员自己检测 // #include <iostream> #include <stdio.h> #include <io.h> #include <dos.h> #include <fstream> #include <string.h> //#define READ_LEN 1024; int length_dis; void RepStr(char *str,char *strDest, char *strSearch, char *strExchange); int main(void) { int length_dest,readLength = 1; const int READ_LEN = 1024; FILE *fp,*fpw; char search_str[1024];//要替换的单词 char exchange_str[1024];//要替换成的单词 char org_str[1024];//源文件里的 char dest_str[2048];//目标文件里的 memset(dest_str, 0, sizeof(dest_str));//清除dest_str里的乱码 printf("Please enter your want to replace's string! :"); scanf("%s",search_str);//计算出旧单词的长度 printf("Please enter your want to change's string! :"); scanf("%s",exchange_str);//计算出新单词的长度 fp = fopen("c://file.txt","rb"); if(fp == NULL) { perror("Open File Error!"); return -1; } fpw = fopen("c://exchange.txt","rb+"); if(fpw == NULL) { fclose(fp); perror("Open File Error!"); return -1; } while(!feof(fp) && readLength != 0) { int i; memset(org_str,0,sizeof(org_str)); readLength = fread(org_str,sizeof(char),READ_LEN,fp); printf("/n读取长度%d/n",readLength); if(org_str[READ_LEN - 1] != NULL) { for(i = 1023 ;i > 0; i--) { if(org_str[i] != ' ') continue; else { i = 1023 - i; fseek(fp,-i,1); for(int j = i;j >= 0;j--) { org_str[1023 - j] = NULL; } break; } } } RepStr(org_str,dest_str,search_str,exchange_str); fseek(fp, - length_dis,1); length_dest = sizeof(dest_str)/sizeof(char); fwrite(dest_str,sizeof(char),length_dest,fpw); printf("/n%s",dest_str); memset(dest_str,0,sizeof(dest_str)); } fclose(fp); fclose(fpw); } /// <summary> /// 指定单词替换成指定的单词 /// </summary> /// <param name="str">[in] char *str:从文件中读取来的字符的首地址。</param> /// <param name="strDest">[out] char *strDest:将要保存在文件中的字符的首地址。</param> /// <param name="strSearch">[in] char *strSearch:指向第一个字符串的指针。</param> /// <param name="strExchange">[in] char *strExchange指向第二个字符串的指针。</param> /// <returns>无返回值,用指针调用直接改变数组中的元素。</returns> void RepStr(char *str,char *strDest, char *strSearch, char *strExchange) { char *pDest, *pIn, *pOut ,*pInTemp1, *pInTemp2; int result,nSrcLen,nExcLen,nLen,count = 0; pIn = str; pInTemp1 = str;//定义了两个临时字符指针变量用来存放要替换的字符串前后的值,如果前后都为空的话就是单词,应该被替换(字符串后) pInTemp2 = str;//字符串前 pOut = strDest; //计算被替换串和替换串的长度 nSrcLen = strlen(strSearch); nExcLen = strlen(strExchange); //查找pIn指向字符串中第一次出现替换串的位置,并返回指针(找不到则返回NULL) pDest = strstr( str, strSearch); result = (int)(pDest - str + 1); if ( pDest == NULL ) { strcpy(pOut,pIn); return; } else { while(pDest) { //计算被替换串前面字符串的长度 nLen = (int)(pDest - pIn);//计算的两指针之间的距离,不是指针里的值相减。 pInTemp1 = pDest + nSrcLen;//指向(保存)被替换字符串的后一位地址 pInTemp2 = pDest - 1;//指向(保存)被替换字符串的前一位的地址 //如果两个指针里的值都是' ','.', ',',则说明字符串为单词,替换! while((*pInTemp1 == ' '|| *pInTemp1 == '.' || *pInTemp1 == ',') && ( *pInTemp2 == ' '|| *pInTemp2 == '.' || *pInTemp2 == ',')) { count ++;//记录匹配的次数。 //复制到输出字符串 memcpy(pOut ,pIn ,nLen);//把单词前的字符复制到pOut里 memcpy(pOut + nLen,strExchange,nExcLen);//把单词复制到pOut里 //跳过被替换串 pIn = pDest + nSrcLen; //调整指向输出串的指针位置 pOut = pOut + nLen + nExcLen;//指针指向单词之后 //继续查找 pDest =strstr(pIn ,strSearch); pInTemp1 = pDest + nSrcLen; pInTemp2 = pDest - 1; nLen = (int)(pDest - pIn);//被替换字符串前的长度,strstr()只知道有一样的,但是还不一定那是单词。 if(pDest == NULL) { length_dis = count * (nExcLen - nSrcLen); for(int t = 0; t <= length_dis; t ++) { *( str + 1023 - t) = NULL; } break; } } //如果字符串前后不是'',也就是不是单词,后的操作 if( pDest != NULL ) { memcpy(pOut,pIn,nLen+nSrcLen);//不是单词,也要复制过去 pIn = pDest + nSrcLen;//pIn往后挪nSrcLen个长度 pOut = pOut + nLen +nSrcLen;//同上 pDest =strstr(pIn ,strSearch); } } //pIn = pIn - length_dis; //复制剩余字符串 strcpy(pOut,pIn); } }