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

XY

沒有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

刪除字符串中的子串

Posted on 2008-06-04 14:09 路緣 閱讀(6679) 評論(14)  編輯 收藏 引用 所屬分類: C/C++
題目:
         請編寫一個函數,刪除一個字符串的一部分。函數原型如下:
               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.函數中的任何地方都不應該使用下標引用。
       一個值得注意的是,空字符串是每個字符串的一個子串,如果字符串中刪除一個空字符串不會產生變化。
算法:
#include <stdlib.h>
#include 
<stdio.h>

#define TRUE 1
#define FALSE 0

/*********************************************************
函數聲明
*/

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

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,不進行重復刪除*/
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)/***如果當前的主串和子串字符相等*/
            
{
                strP++;/**//***則主串指針向前移一個字符*/
                flag = FALSE;/**//*設置為false,防止后續的主串指針,重復移動*/
                continue;
            }
            
break;
        }

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

        
if(flag)
            strP
++;
    }

    
return TRUE;
}

說明:
       最先str1的定義為 char *,然而就會出現while(*temp++ = *strP++)語句報錯。報錯誤寫入位置 0x00447240 時發生訪問沖突,我的理解是因為字符指針temp指向的是字符串常量,不允許進行修改。所以定義為
         char str1 [] 很關鍵。
       經上網查資料,解釋是:
       C++中數據存儲區分為五種:
棧、堆(new分配)、自由存儲區(malloc分配)、全局/靜態變量存儲區、常量存儲區(不允許修改,除非采用特殊手段)。 字符串這種常量就存在常量區中。全局、靜態變量放在靜態存儲區,而它們是可以被修改的。

Feedback

# re: 刪除字符串中的子串[未登錄]  回復  更多評論   

2008-06-04 16:11 by raof01
感覺博主對于傳參方式(傳值)沒有理解。
函數原型有錯誤:無法返回該字符串。感覺下面會好一點:
char* del_substr(char* str, const char * substr);
說不用字符串操作函數,我就hack一把——自己寫操縱字符串的庫函數,呵呵……:
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: 刪除字符串中的子串[未登錄]  回復  更多評論   

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

# re: 刪除字符串中的子串  回復  更多評論   

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

# re: 刪除字符串中的子串  回復  更多評論   

2008-06-05 10:13 by 路緣
@raof01
確實有問題,我現把更改的代碼貼在下面,但不知為為何說我的方法無法返回字符串,對傳參方式沒有理解。del_substr(char *str, char const *substr)傳遞的是主串指針的拷貝,但它和原字符串指針指向的是相同的位置,通過改變所指位置的內容來達到改變原字符串的目的。
 
關于你提供的代碼,我修改如下。還是謝謝你的熱心回復。讓我同時也學了一些東西
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: 刪除字符串中的子串  回復  更多評論   

2008-06-05 13:11 by raof01
@路緣
看來沒有唬住你。你的理解是沒錯的,呵呵。
除了del_substr(),別的還有問題嗎?

# re: 刪除字符串中的子串  回復  更多評論   

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

關于字符串的比較,跟庫函數的寫法的出入,我還得研究哈一些細節東西,看能不能琢磨出差別的用意。

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

# re: 刪除字符串中的子串  回復  更多評論   

2008-06-05 15:54 by 路緣
@passerby
謝謝你,KMP算法大學時學過,謝謝你的提醒,你讓我知道事情不是做完那么簡單,還得精益求精,我會抽時間,再寫一個改進的算法來實現。

# re: 刪除字符串中的子串  回復  更多評論   

2008-06-05 17:51 by raof01
@路緣
也沒啥問題了——我沒有仔細考慮,時間緊,我只拿了5分鐘來寫這個。

# re: 刪除字符串中的子串  回復  更多評論   

2008-07-09 10:20 by chu
效率似乎太低了點

# re: 刪除字符串中的子串  回復  更多評論   

2008-12-03 16:33 by 佰銳科技
StrCmp 應該改為StrNCmp

# re: 刪除字符串中的子串  回復  更多評論   

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

# re: 刪除字符串中的子串  回復  更多評論   

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;
} 能刪除全部出現的子字符串,但是“如果substr多次出現在str中,函數只刪除第1次出現的子串”,這段代碼會把重復出現的也刪除。。。

# re: 刪除字符串中的子串  回復  更多評論   

2010-01-08 15:07 by ff
看錯了~~sorry

# re: 刪除字符串中的子串  回復  更多評論   

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麻豆的观看方式| 免费人成网站在线观看欧美高清| 亚洲美女淫视频| 先锋影音国产一区| 91久久国产自产拍夜夜嗨| 91久久久亚洲精品| 国产精品一区二区三区成人| 久久久午夜电影| 欧美日韩在线播放三区四区| 午夜免费电影一区在线观看| 久久久久一本一区二区青青蜜月| 亚洲福利视频三区| 99综合电影在线视频| 国产综合av| 一区二区免费在线视频| 极品少妇一区二区三区| 亚洲精品中文字幕有码专区| 国产一区二区三区在线观看网站| 亚洲国产第一| 国内精品久久久久久久影视蜜臀| 99www免费人成精品| 在线观看一区视频| 亚洲综合第一| 一区二区日韩伦理片| 久久免费视频网| 久久国产直播| 欧美亚一区二区| 国产精品毛片一区二区三区| av成人国产| 鲁鲁狠狠狠7777一区二区| 亚洲欧美福利一区二区| 亚洲国产一区在线观看| 亚洲免费婷婷| 午夜久久久久久| 欧美日韩中文在线观看| 亚洲福利视频三区| 极品尤物一区二区三区| 午夜性色一区二区三区免费视频| 亚洲视频一区在线| 欧美另类久久久品 | 欧美日产一区二区三区在线观看| 牛牛国产精品| 影音先锋日韩有码| 久久精品二区亚洲w码| 久久精品国产在热久久| 欧美—级a级欧美特级ar全黄| 亚洲国产成人久久综合| 欧美国产亚洲精品久久久8v| 狠狠色伊人亚洲综合网站色| 性欧美1819sex性高清| 午夜精品福利在线| 国产精品久久久久av| 亚洲综合社区| 久久久久国产精品一区三寸| 国产在线精品成人一区二区三区| 午夜精彩国产免费不卡不顿大片| 欧美一级视频一区二区| 国产一区二区三区黄| 欧美一区二区三区精品| 久久一区二区三区国产精品| 精品av久久707| 毛片av中文字幕一区二区| 亚洲电影观看| 中文日韩欧美| 国产一区在线免费观看| 久久免费黄色| 亚洲精品一区二区网址| 亚洲在线黄色| 国产在线不卡精品| 久久在线免费观看| 亚洲免费观看高清在线观看 | 亚洲影视在线播放| 亚洲精品欧洲精品| 欧美一区深夜视频| 女人香蕉久久**毛片精品| 亚洲高清三级视频| 欧美日韩久久精品| 性久久久久久久| 亚洲第一黄网| 午夜精品久久久久久久白皮肤| 狠久久av成人天堂| 欧美久久视频| 午夜精品一区二区三区电影天堂| 蜜臀av一级做a爰片久久| 夜夜嗨网站十八久久| 国产欧美韩日| 欧美精品国产| 欧美中文字幕视频在线观看| 欧美激情在线播放| 久久狠狠婷婷| 99精品欧美一区二区三区综合在线 | 亚洲国产一区二区视频| 日韩亚洲视频| 国产主播一区二区三区| 欧美日韩一区二区在线观看| 羞羞漫画18久久大片| 亚洲日本理论电影| 久久九九国产| 亚洲在线观看免费| 亚洲国产综合在线| 国产午夜亚洲精品羞羞网站 | 免费日韩av电影| 性亚洲最疯狂xxxx高清| 亚洲美女少妇无套啪啪呻吟| 久热re这里精品视频在线6| 亚洲欧美日韩精品久久久久| 亚洲激情网站| 亚洲高清123| 国产婷婷色一区二区三区| 欧美日韩在线影院| 欧美搞黄网站| 免播放器亚洲一区| 久久久久久久一区二区| 亚洲欧美日韩国产一区二区| 亚洲毛片av在线| 亚洲精品老司机| 亚洲国产精品第一区二区| 久久久青草青青国产亚洲免观| 亚洲免费在线观看视频| 一本大道久久a久久综合婷婷 | 亚洲黄网站在线观看| 在线观看91精品国产入口| 国产在线高清精品| 国产视频亚洲精品| 国产欧美一区二区三区另类精品| 国产精品国产一区二区| 国产精品每日更新| 国产精品卡一卡二卡三| 国产精品高潮呻吟| 国产精品日韩在线| 国产欧美韩国高清| 国产自产在线视频一区| 狠狠久久综合婷婷不卡| 狠狠色香婷婷久久亚洲精品| 欧美日韩一卡二卡| 久久久久久穴| 久久亚洲午夜电影| 另类av导航| 亚洲国产第一| av成人免费在线观看| 99热在线精品观看| 亚洲在线视频网站| 欧美一区二区三区四区高清 | 欧美日韩无遮挡| 国产精品女主播一区二区三区| 国产精品久久久久久久久免费桃花| 欧美视频中文一区二区三区在线观看| 欧美性猛交一区二区三区精品| 国产精品久久久久高潮| 韩日在线一区| 亚洲日本在线视频观看| 亚洲午夜精品网| 久久av免费一区| 美女黄毛**国产精品啪啪| 亚洲国产精品www| 亚洲视频一区| 久久久亚洲精品一区二区三区| 欧美大片一区| 国产欧美日韩精品丝袜高跟鞋| 影视先锋久久| 99热精品在线| 另类酷文…触手系列精品集v1小说| 亚洲高清在线精品| 午夜在线观看欧美| 欧美高清自拍一区| 国内精品亚洲| 亚洲一区二区三区视频| 久久五月激情| 亚洲免费av电影| 久久全球大尺度高清视频| 欧美日韩亚洲视频一区| 在线电影欧美日韩一区二区私密| 亚洲色图在线视频| 裸体一区二区三区| 亚洲一区二区欧美日韩| 欧美粗暴jizz性欧美20| 国产亚洲人成a一在线v站| 99精品欧美一区二区三区综合在线| 久久看片网站| 亚洲欧美国产三级| 欧美激情影院| 亚洲成色777777女色窝| 久久国产精品色婷婷| 一本大道久久精品懂色aⅴ | 亚洲影院一区| 国产精品vvv|