青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

XY

沒(méi)有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

刪除字符串中的子串

Posted on 2008-06-04 14:09 路緣 閱讀(6685) 評(píng)論(14)  編輯 收藏 引用 所屬分類: C/C++
題目:
         請(qǐng)編寫一個(gè)函數(shù),刪除一個(gè)字符串的一部分。函數(shù)原型如下:
               int del_substr(char *str, char const *substr)
         函數(shù)首先應(yīng)判斷substr是否出現(xiàn)在str中。如果它并未出現(xiàn),函數(shù)就返回0;如果出現(xiàn),函數(shù)應(yīng)該把str中位于該子串后面的所有字符復(fù)制到該子串的位置,從而刪除這個(gè)子串,然后函數(shù)返回1。如果substr多次出現(xiàn)在str中,函數(shù)只刪除第1次出現(xiàn)的子串。函數(shù)的第2個(gè)參數(shù)絕不會(huì)被修改。
         舉個(gè)例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函數(shù)應(yīng)該返回0,str未作任何修改。但如果substr指向CDE,函數(shù)就把str修改為指向ABFG,方法是把F、G和結(jié)尾的NUL字節(jié)復(fù)制到C的位置,然后函數(shù)返回1。不論出現(xiàn)什么情況,函數(shù)的第2個(gè)參數(shù)都不應(yīng)該被修改。
        要求:a.你不應(yīng)該使用任何用于操縱字符串的庫(kù)函數(shù)(如strcpy, strcmp, 等)。
                    b.函數(shù)中的任何地方都不應(yīng)該使用下標(biāo)引用。
       一個(gè)值得注意的是,空字符串是每個(gè)字符串的一個(gè)子串,如果字符串中刪除一個(gè)空字符串不會(huì)產(chǎn)生變化。
算法:
#include <stdlib.h>
#include 
<stdio.h>

#define TRUE 1
#define FALSE 0

/*********************************************************
函數(shù)聲明
*/

int del_substr(char *str, char const *substr);
/*********************************************************
主函數(shù)
*/

int main()
{
    
char str1 [] = "aabcdefgh324";
    
char const * str2= "abc";

    printf(
"before delete: %s\n", str1);
    printf(
"will delete che chars: %s\n", str2);
    del_substr(str1, str2);
    printf(
"After delete: %s\n", str1);

    system(
"pause");
    
return 0;
}

/***刪除字符串str中包含的子串substr,不進(jìn)行重復(fù)刪除*/
int del_substr(char *str, char const *substr)
{
    
char const * subP;
    
char *strP;
    
char *temp;
    
int flag = TRUE;

    strP 
= str;
    
if((!*str) || *substr == '\0')/***如果主串為空或子串為空字符串,則返回*/
        
return FALSE;

    
while(*strP)
    
{        
        temp 
= strP;
        
for(subP=substr; *subP; subP++)
        
{
            
if(*strP == *subP)/***如果當(dāng)前的主串和子串字符相等*/
            
{
                strP++;/**//***則主串指針向前移一個(gè)字符*/
                flag = FALSE;/**//*設(shè)置為false,防止后續(xù)的主串指針,重復(fù)移動(dòng)*/
                continue;
            }
            
break;
        }

        
        
if(*subP == '\0'/***如果subP指向末尾的'\0'則表示子串匹配成功*/
        
{
            
while(*temp++ = *strP++)/***進(jìn)行字符復(fù)制*/
                ;
/***空語(yǔ)句*/
            
break;
        }

        
if(flag)
            strP
++;
    }

    
return TRUE;
}

說(shuō)明:
       最先str1的定義為 char *,然而就會(huì)出現(xiàn)while(*temp++ = *strP++)語(yǔ)句報(bào)錯(cuò)。報(bào)錯(cuò)誤寫入位置 0x00447240 時(shí)發(fā)生訪問(wèn)沖突,我的理解是因?yàn)樽址羔榯emp指向的是字符串常量,不允許進(jìn)行修改。所以定義為
         char str1 [] 很關(guān)鍵。
       經(jīng)上網(wǎng)查資料,解釋是:
       C++中數(shù)據(jù)存儲(chǔ)區(qū)分為五種:
棧、堆(new分配)、自由存儲(chǔ)區(qū)(malloc分配)、全局/靜態(tài)變量存儲(chǔ)區(qū)、常量存儲(chǔ)區(qū)(不允許修改,除非采用特殊手段)。 字符串這種常量就存在常量區(qū)中。全局、靜態(tài)變量放在靜態(tài)存儲(chǔ)區(qū),而它們是可以被修改的。

Feedback

# re: 刪除字符串中的子串[未登錄](méi)  回復(fù)  更多評(píng)論   

2008-06-04 16:11 by raof01
感覺(jué)博主對(duì)于傳參方式(傳值)沒(méi)有理解。
函數(shù)原型有錯(cuò)誤:無(wú)法返回該字符串。感覺(jué)下面會(huì)好一點(diǎn):
char* del_substr(char* str, const char * substr);
說(shuō)不用字符串操作函數(shù),我就hack一把——自己寫操縱字符串的庫(kù)函數(shù),呵呵……:
ssize_t Strlen(const char* str)
{
ssize_t len = 0;
while (*str++) ++len;
return len;
}

int StrCmp(const char* str1, const char* str2, ssize_t len)
{
for (int i = 0; i < len; ++i)
{
if (*(str1 + i) != *(str2 + i))
return (*(str1 + i) - *(str2 + i));
}
return 0;
}

char* del_substr(char* str, const char * substr)
{
char* temp = NULL;
ssize_t len = Strlen(substr);
while (*substr++ && *str++)
{
if (*substr == *str)
{
if (!StrCmp(substr, str, len))
{
temp = str + len;
while (*temp++)
{
*str++ = *temp;
}
break;
}
}
}
return str;
}

# re: 刪除字符串中的子串[未登錄](méi)  回復(fù)  更多評(píng)論   

2008-06-04 16:15 by raof01
這幾行代碼里面有寫錯(cuò)誤,不知道你看出來(lái)了沒(méi)有?呵呵。希望你能改掉這些錯(cuò)誤。

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 01:41 by passerby
為何不用KMP來(lái)比較字符呢

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 10:13 by 路緣
@raof01
確實(shí)有問(wèn)題,我現(xiàn)把更改的代碼貼在下面,但不知為為何說(shuō)我的方法無(wú)法返回字符串,對(duì)傳參方式?jīng)]有理解。del_substr(char *str, char const *substr)傳遞的是主串指針的拷貝,但它和原字符串指針指向的是相同的位置,通過(guò)改變所指位置的內(nèi)容來(lái)達(dá)到改變?cè)址哪康摹?/span>
 
關(guān)于你提供的代碼,我修改如下。還是謝謝你的熱心回復(fù)。讓我同時(shí)也學(xué)了一些東西
char* del_substr(char* str, const char * substr) 

    
char* temp = NULL, *cp = str; 
    ssize_t len 
= Strlen(substr); 
    
while (*str) 
    

        
if (*substr == *str) 
        

            
if (!StrCmp(substr, str, len)) 
            

                temp 
= str + len; 
                
while (*str++ = *temp++
                    ;
                
break
            }
 
        }
 
        str
++;
    }
 
    
return cp; 
}
 
 

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 13:11 by raof01
@路緣
看來(lái)沒(méi)有唬住你。你的理解是沒(méi)錯(cuò)的,呵呵。
除了del_substr(),別的還有問(wèn)題嗎?

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 15:52 by 路緣
看來(lái)沒(méi)有唬住你。你的理解是沒(méi)錯(cuò)的,呵呵。
除了del_substr(),別的還有問(wèn)題嗎?
--------------------------------------------------------
@raof01,問(wèn)題我是找不出來(lái)了,不過(guò)我對(duì)比了哈C的庫(kù)函數(shù),你的代碼,
while (*str++) ++len;
不如庫(kù)函數(shù)中的
const char *eos = str;
while( *eos++ )
;
return( eos - str - 1 );
寫法效率高。

關(guān)于字符串的比較,跟庫(kù)函數(shù)的寫法的出入,我還得研究哈一些細(xì)節(jié)東西,看能不能琢磨出差別的用意。

如果代碼中還有其他問(wèn)題,還望@raof01不吝賜教,謝謝了。

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 15:54 by 路緣
@passerby
謝謝你,KMP算法大學(xué)時(shí)學(xué)過(guò),謝謝你的提醒,你讓我知道事情不是做完那么簡(jiǎn)單,還得精益求精,我會(huì)抽時(shí)間,再寫一個(gè)改進(jìn)的算法來(lái)實(shí)現(xiàn)。

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-06-05 17:51 by raof01
@路緣
也沒(méi)啥問(wèn)題了——我沒(méi)有仔細(xì)考慮,時(shí)間緊,我只拿了5分鐘來(lái)寫這個(gè)。

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-07-09 10:20 by chu
效率似乎太低了點(diǎn)

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2008-12-03 16:33 by 佰銳科技
StrCmp 應(yīng)該改為StrNCmp

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2010-01-08 14:30 by ff
if(flag)
strP++;
后少了點(diǎn)吧?沒(méi)有找到的時(shí)候死循環(huán)了吧?
加else break;可以解決~

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2010-01-08 15:03 by ff
char* del_substr(char* str, const char * substr)
{
char* temp = NULL, *cp = str;
ssize_t len = Strlen(substr);
while (*str)
{
if (*substr == *str)
{
if (!StrCmp(substr, str, len))
{
temp = str + len;
while (*str++ = *temp++)
;
break;
}
}
str++;
}
return cp;
} 能刪除全部出現(xiàn)的子字符串,但是“如果substr多次出現(xiàn)在str中,函數(shù)只刪除第1次出現(xiàn)的子串”,這段代碼會(huì)把重復(fù)出現(xiàn)的也刪除。。。

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2010-01-08 15:07 by ff
看錯(cuò)了~~sorry

# re: 刪除字符串中的子串  回復(fù)  更多評(píng)論   

2010-03-13 00:47 by sb
ssize_t是什么類型?
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美伊人| 欧美成人首页| 亚洲高清激情| 亚洲影院色无极综合| 夜夜嗨av一区二区三区四季av| 亚洲国产视频一区二区| 精品成人一区| 亚洲国内在线| 亚洲一区二区在线播放| 久久gogo国模啪啪人体图| 久久久久久久一区二区| 男女av一区三区二区色多| 亚洲丶国产丶欧美一区二区三区| 亚洲高清电影| 午夜在线电影亚洲一区| 久久中文在线| 欧美人妖在线观看| 国产亚洲欧洲| 一区二区三区欧美成人| 久久精品一区二区三区四区| 亚洲第一精品电影| 亚洲综合色激情五月| 蜜桃伊人久久| 国产模特精品视频久久久久| 亚洲国产精品视频一区| 午夜精品在线| 亚洲国产欧美另类丝袜| 亚洲欧美综合网| 欧美激情一区二区| 韩国av一区二区三区| 国模私拍视频一区| 老司机久久99久久精品播放免费 | 在线亚洲观看| 久久免费精品日本久久中文字幕| 欧美国产乱视频| 国产视频久久久久| 亚洲午夜av电影| 亚洲高清av在线| 久久精品视频播放| 国产精品乱子乱xxxx| 亚洲欧洲三级电影| 久久亚洲欧洲| 欧美一区二区三区免费视频| 欧美日韩亚洲成人| 亚洲精品无人区| 老鸭窝亚洲一区二区三区| 亚洲欧美另类国产| 国产精品美女久久久| 99视频在线观看一区三区| 免费精品视频| 久久人人爽人人爽| 精品二区视频| 裸体一区二区| 久久久久久一区| 国内精品伊人久久久久av影院| 亚洲欧美日韩电影| 一区二区电影免费观看| 欧美日韩国产精品一区| 日韩系列在线| 亚洲美女色禁图| 欧美日韩在线亚洲一区蜜芽| 99在线观看免费视频精品观看| 亚洲第一区在线观看| 欧美 日韩 国产在线| 亚洲激情电影在线| 亚洲欧洲在线观看| 欧美日韩亚洲一区二区三区在线| 99伊人成综合| 中文国产亚洲喷潮| 国产欧美一区二区三区久久人妖 | 久久久久欧美精品| 精品69视频一区二区三区| 久久免费视频网站| 美女网站久久| 一本久道久久综合狠狠爱| 亚洲人体大胆视频| 国产精品久久久久久久久久免费| 午夜精品在线视频| 久久免费视频在线| 一本色道久久综合亚洲精品不 | 一区在线影院| 国产一区二区三区在线播放免费观看| 一本色道久久综合亚洲精品不卡 | 男人天堂欧美日韩| 亚洲黄一区二区三区| 欧美国产一区在线| 欧美激情精品| 亚洲欧美国产视频| 欧美专区在线播放| 亚洲国产日韩美| 亚洲破处大片| 国产精品va在线播放| 欧美在线国产精品| 鲁鲁狠狠狠7777一区二区| 这里只有精品丝袜| 久久国产乱子精品免费女 | 亚洲老板91色精品久久| 亚洲精品之草原avav久久| 国产九色精品成人porny| 男人天堂欧美日韩| 欧美体内谢she精2性欧美| 久久偷看各类wc女厕嘘嘘偷窃| 欧美激情一区二区三级高清视频| 欧美专区在线观看| 欧美精品偷拍| 久久一区欧美| 国产精品日韩欧美一区二区| 欧美二区在线看| 国产精品自拍网站| 亚洲精品麻豆| 激情六月婷婷久久| 亚洲欧美www| 一本色道久久88亚洲综合88| 久久精品视频导航| 久久精品国产96久久久香蕉| 欧美日韩国产精品一卡| 欧美成人激情在线| 狠狠色狠狠色综合人人| 亚洲一区二区三区欧美| 一区二区三区黄色| 欧美电影免费观看| 男男成人高潮片免费网站| 国产亚洲成精品久久| 亚洲视频在线观看网站| 一区二区三区精品视频| 免费不卡在线观看av| 久久中文字幕一区| 国产在线国偷精品产拍免费yy| 宅男噜噜噜66一区二区| 日韩午夜电影| 毛片一区二区| 欧美激情国产日韩| 亚洲国产1区| 久久一区二区三区超碰国产精品| 久久精品国产久精国产思思| 国产美女一区二区| 午夜精品福利视频| 欧美中文在线观看国产| 国产欧美日韩视频| 久久国产精品一区二区| 国产三区二区一区久久| 99人久久精品视频最新地址| 日韩一区二区精品| 欧美日韩三级视频| 亚洲深夜福利| 先锋a资源在线看亚洲| 国产精品免费看片| 亚洲欧美日韩在线播放| 久久国产精品免费一区| 韩日在线一区| 久久久久久久综合色一本| 国内成+人亚洲| 久久精品视频在线看| 女仆av观看一区| 亚洲日本va午夜在线电影| 欧美日韩国产精品一区| 亚洲欧美99| 美女亚洲精品| 亚洲三级电影在线观看| 欧美视频你懂的| 欧美一区二区三区四区夜夜大片 | 久久精品日产第一区二区三区| 国产精品综合| 久久夜色精品亚洲噜噜国产mv| 亚洲国产精品黑人久久久| 日韩视频免费| 国产丝袜美腿一区二区三区| 久久综合久久综合九色| 日韩视频在线观看免费| 欧美在线三级| 亚洲精品欧洲精品| 国产精品美女久久久久aⅴ国产馆| 久久高清一区| 亚洲精品在线电影| 久热精品在线视频| 亚洲天堂成人在线观看| 国产老肥熟一区二区三区| 老司机午夜精品视频| 一区二区三区视频在线| 母乳一区在线观看| 欧美一级黄色网| 亚洲免费观看在线观看| 黄色av成人| 国产精品日韩久久久| 免费在线亚洲| 欧美在线日韩| 亚洲一区二区三区高清不卡| 亚洲国产精品999| 久久精品日产第一区二区| 在线一区欧美| 亚洲毛片在线观看| 一区二区三区在线观看视频| 国产精品国产三级国产普通话蜜臀 | 亚洲精品在线免费观看视频| 国产精品日韩欧美综合| 欧美日韩大片一区二区三区| 久久精品伊人| 欧美一区二区三区另类| 亚洲午夜伦理| 一本到12不卡视频在线dvd|