删除字符串中的子串

标签:
杂谈 |
分类: job |
题目:
请编写一个函数,删除一个字符串的一部分。函数原型如下:
int
del_substr(char *str, char const *substr)
函数首先应判断substr是否出现在str中。如果它并未出现,函数就返回0;如果出现,函数应该把str中位于该子串后面的所有字符复制到该子串的位置,从而删除这个子串,然后函数返回1。如果substr多次出现在str中,函数只删除第1次出现的子串。函数的第2个参数绝不会被修改。
举个例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函数应该返回0,str未作任何修改。但如果substr指向CDE,函数就把str修改为指向ABFG,方法是把F、G和结尾的NUL字节复制到C的位置,然后函数返回1。不论出现什么情况,函数的第2个参数都不应该被修改。
要求:a.你不应该使用任何用于操纵字符串的库函数(如strcpy, strcmp, 等)。
b.函数中的任何地方都不应该使用下标引用。
一个值得注意的是,空字符串是每个字符串的一个子串,如果字符串中删除一个空字符串不会产生变化。
算法:
算法:
http://www.cppblog.com/Images/OutliningIndicators/None.gif#include <stdlib.h>
http://www.cppblog.com/Images/OutliningIndicators/None.gif#include <stdio.h>
http://www.cppblog.com/Images/OutliningIndicators/None.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gif#defineTRUE 1
http://www.cppblog.com/Images/OutliningIndicators/None.gif#defineFALSE 0
http://www.cppblog.com/Images/OutliningIndicators/None.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifintdel_substr( char *str, char const *substr);
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifintmain()
http://www.cppblog.com/Images/dot.gif {
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif char str1 [] = "aabcdefgh324";
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif char const * str2 = "abc";
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif printf( "before delete: %s\n ", str1);
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif printf( "will delete che chars: %s\n ", str2);
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif del_substr(str1, str2);
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif printf( "After delete: %s\n ", str1);
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif system( "pause");
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif return 0;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifintdel_substr( char *str, char const *substr)
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif char const * subP;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif char *strP;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif char *temp;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif int flag = TRUE;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif strP = str;
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif if((!*str) || *substr == '\0')
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif return FALSE;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif while(*strP)
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif temp = strP;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif for(subP=substr; *subP; subP ++)
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif if(*strP == *subP)
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif strP++;
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif flag = FALSE;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif continue;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif break;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif if(*subP == '\0')
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif while(*temp++ = *strP++)
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif ;
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif break;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif if(flag)
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif strP ++;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif return TRUE;
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/None.gif#include
http://www.cppblog.com/Images/OutliningIndicators/None.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gif#define
http://www.cppblog.com/Images/OutliningIndicators/None.gif#define
http://www.cppblog.com/Images/OutliningIndicators/None.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifint
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifint
http://www.cppblog.com/Images/dot.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif }
http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/None.gifint
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/dot.gif{
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif
http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif
http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif }