青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
XY
沒有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
刪除字符串中的子串
Posted on 2008-06-04 14:09
路緣
閱讀(6685)
評論(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是什么類型?
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
相關文章:
算法:快速排序之python實現
算法:找出n個數中重復最多的10個數
反轉字符串
刪除字符串中的子串
得到字符串S1中第一個且是字符串S2中的位置指針
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 路緣
日歷
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆分類
(9)
C/C++(5)
計算機圖形學(1)
數字圖像
網絡通信
系統體系(2)
移動開發(1)
隨筆檔案
(9)
2017年9月 (2)
2008年10月 (2)
2008年9月 (1)
2008年7月 (1)
2008年6月 (3)
博客
本人博客園的博客
搜索
積分與排名
積分 - 36553
排名 - 576
最新評論
1.?re: 反轉字符串
@周翀
剛一看,嚇我一跳,以為一直認為的解法有問題。細想一下,值相等也無妨。當毀掉其中一個值后,再做異或,另一個值就會得到保留,做第3次計算,毀掉的那個值也被恢復了,所以沒有問題。
--路緣
2.?re: 反轉字符串
三次異或可以互換兩個值,也可以毀掉兩個值,當它們相等的時候……
--周翀
3.?re: 深入理解計算機系統1_程序是如何運行的
抄襲
--圖—圖—
4.?re: 刪除字符串中的子串
ssize_t是什么類型?
--sb
5.?re: 刪除字符串中的子串
看錯了~~sorry
--ff
閱讀排行榜
1.?反轉字符串(9856)
2.?深入理解計算機系統1_程序是如何運行的(7999)
3.?刪除字符串中的子串(6685)
4.?分形的樂趣之_Hilbert曲線(2146)
5.?深入理解計算機系統2_信息存儲(2119)
評論排行榜
1.?刪除字符串中的子串(14)
2.?深入理解計算機系統1_程序是如何運行的(12)
3.?反轉字符串(2)
4.?分形的樂趣之_Hilbert曲線(2)
5.?symbian應用程序開發1(1)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
国产精品久久久久久久9999
|
一本色道久久综合亚洲精品小说
|
久久婷婷蜜乳一本欲蜜臀
|
亚洲欧洲日本在线
|
亚洲国产精品传媒在线观看
|
国产精品亚洲第一区在线暖暖韩国
|
欧美成年人网站
|
欧美精品日韩一区
|
国产精品成人一区二区三区吃奶
|
国产精品免费视频观看
|
国产欧美日韩亚洲精品
|
一区在线电影
|
av不卡在线观看
|
久久狠狠久久综合桃花
|
美女视频网站黄色亚洲
|
亚洲欧洲在线观看
|
一区二区三区日韩精品视频
|
亚洲女人av
|
女人天堂亚洲aⅴ在线观看
|
欧美日本一区
|
国产日本欧美一区二区三区在线
|
亚洲国产高潮在线观看
|
一区二区欧美亚洲
|
久久全球大尺度高清视频
|
欧美激情片在线观看
|
亚洲图片欧洲图片av
|
久久久久女教师免费一区
|
欧美日韩国产成人
|
一区在线影院
|
亚洲男人的天堂在线aⅴ视频
|
久久久无码精品亚洲日韩按摩
|
亚洲欧洲在线观看
|
久久国产精品一区二区三区四区
|
男人的天堂亚洲
|
国产精品亚洲成人
|
99精品福利视频
|
欧美国产日本韩
|
久久国产色av
|
国产精品视频第一区
|
午夜精品在线看
|
毛片一区二区
|
国产一区二区三区电影在线观看
|
夜夜嗨av一区二区三区网页
|
欧美成人精品福利
|
欧美在线观看一区
|
国产精品区二区三区日本
|
9l国产精品久久久久麻豆
|
农村妇女精品
|
久久久91精品国产一区二区三区
|
久久国产一区二区
|
亚洲人成人99网站
|
久久先锋资源
|
精品69视频一区二区三区
|
午夜久久美女
|
亚洲午夜在线
|
国产精品久久久一区麻豆最新章节
|
一本一本久久
|
欧美高潮视频
|
亚洲欧洲精品一区二区精品久久久
|
久久蜜臀精品av
|
欧美在线视频一区二区三区
|
国产伦精品一区二区
|
欧美一区二区在线看
|
亚洲一区在线观看免费观看电影高清
|
欧美精品国产一区二区
|
亚洲激情女人
|
亚洲国产日韩一区
|
欧美成人综合在线
|
日韩网站在线观看
|
亚洲精品日日夜夜
|
欧美日一区二区在线观看
|
亚洲精品免费电影
|
欧美国产日韩在线
|
欧美黄色影院
|
欧美午夜片欧美片在线观看
|
亚洲国产精品成人综合
|
亚洲欧美在线另类
|
亚洲视频在线播放
|
国产精品日韩欧美大师
|
欧美一级免费视频
|
午夜精品久久
|
国产一区av在线
|
麻豆精品一区二区综合av
|
蜜臀a∨国产成人精品
|
日韩亚洲欧美在线观看
|
在线亚洲一区
|
国产亚洲毛片
|
欧美在线高清视频
|
久久一区中文字幕
|
麻豆9191精品国产
|
夜久久久久久
|
国产精品入口麻豆原神
|
一区二区三区成人精品
|
午夜欧美不卡精品aaaaa
|
亚洲另类春色国产
|
蜜桃av综合
|
欧美国产在线电影
|
在线观看91精品国产麻豆
|
欧美在线中文字幕
|
伊人天天综合
|
午夜一级久久
|
亚洲第一偷拍
|
国产欧美日韩激情
|
久久se精品一区精品二区
|
亚洲高清资源
|
亚洲高清久久久
|
亚洲高清精品中出
|
在线视频亚洲一区
|
国产一区久久久
|
亚洲日本成人在线观看
|
国产欧美日韩精品a在线观看
|
欧美大片在线观看
|
欧美午夜大胆人体
|
免费观看成人鲁鲁鲁鲁鲁视频
|
欧美日韩精品欧美日韩精品
|
久久成人在线
|
欧美日韩亚洲不卡
|
免费观看久久久4p
|
国产精品亚洲片夜色在线
|
亚洲国产欧美精品
|
亚洲第一福利社区
|
欧美在线黄色
|
欧美在线日韩
|
欧美午夜免费影院
|
亚洲裸体在线观看
|
亚洲国产日韩欧美在线99
|
亚洲欧美日韩国产成人
|
亚洲小说区图片区
|
欧美精品一区二区视频
|
亚洲国产高清一区
|
狠狠色狠狠色综合人人
|
亚洲一区二区高清
|
亚洲欧美国产精品va在线观看
|
欧美激情91
|
亚洲激情视频在线播放
|
亚洲欧洲另类
|
欧美成年网站
|
亚洲欧洲精品一区二区三区不卡
|
亚洲国产精彩中文乱码av在线播放
|
欧美在线一区二区
|
欧美黄色日本
|
你懂的视频一区二区
|
亚洲影院色无极综合
|
亚洲一区在线观看免费观看电影高清
|
欧美精品在线视频观看
|
亚洲日本va午夜在线电影
|
亚洲精品日韩综合观看成人91
|
欧美大片免费
|
99精品国产在热久久下载
|
中文亚洲视频在线
|
欧美亚男人的天堂
|
亚洲一区日韩
|
久久久久www
|
1000精品久久久久久久久
|
亚洲国产婷婷香蕉久久久久久99
|
在线观看福利一区
|
在线播放日韩
|
夜夜精品视频一区二区
|
久久在线免费视频
|
亚洲丰满少妇videoshd
|
亚洲精品偷拍
|
亚洲理论在线
|
欧美视频1区
|
欧美在线观看一二区
|
欧美一区二区大片
|
亚洲第一黄网
|
麻豆91精品
|
欧美成熟视频
|
欧美激情视频给我
|
亚洲自拍电影
|
久久久久88色偷偷免费
|
亚洲理论电影网
|
一区二区免费在线播放
|
欧美视频在线免费
|
欧美一区二区三区日韩
|
久久综合九色综合久99
|
夜夜躁日日躁狠狠久久88av
|
欧美一区二区
|
在线亚洲观看
|
欧美诱惑福利视频
|
日韩网站在线观看
|
性欧美video另类hd性玩具
|
最新国产乱人伦偷精品免费网站
|
日韩一级不卡
|
国内精品久久久久久影视8
|
亚洲欧美激情视频
|
久久久91精品国产一区二区三区
|
99re热这里只有精品免费视频
|
亚洲一区二区成人在线观看
|
亚洲日本中文字幕
|
亚洲午夜女主播在线直播
|
亚洲国产日韩一区
|
亚洲视屏在线播放
|
亚洲日本中文字幕区
|
久久国产精品久久w女人spa
|
一个色综合导航
|
国产在线欧美日韩
|
一区二区三区回区在观看免费视频
|
国产亚洲一区二区三区在线观看
|
99国产精品久久久久久久成人热
|