evil666
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:3 回覆:4 積分:1 註冊:2004-09-22
發送簡訊給我
|
大家好~ 小弟想請教一下? 關於下面這段小弟的練習。
#include using namespace std; char *DeleteEmpty(char *Str)
{
char *tmp;
int i=0,x=0;
while(Str[i] != '\0')
{
if(Str[i] != ' ')
{
tmp[x] = Str[i];
x ;
}
i ;
}
tmp[x] = '\0';
return tmp;
} int main(void)
{
char *str1="Hello C & C ";
char *str2;
cout << "str1 為:" << str1 << endl;
str2 = DeleteEmpty(str1);
cout << "str2 為:" << str2 << endl;
system("pause");
return 0;
} 上面的程式,是想將str1中的空白使用DeleteEmpty()給去除掉, 並輸出為str2。 但是? 1.)小弟將以上的程式,使用除錯 > 逐步執行,能夠完整跑完。 而且看起來程式並沒錯誤… 2.)compiler也沒錯誤 但實際執行的時候,卻會出現錯誤? 能請各位板大幫小弟除錯一下嗎? 感恩! m(_._)m 發表人 - evil666 於 2005/11/17 09:50:19
|
richtop
資深會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:122 回覆:646 積分:468 註冊:2003-06-10
發送簡訊給我
|
evil666 您好: 問題應該是出在:
char *tmp;
BCB6中嘗試著將其改為:
char *tmp = Str; // 指向原字串的開頭
就能執行了! 原因是:宣告char *tmp;但沒有指向或給予足夠字元儲存空間,所以可能發生誤填記憶體的錯誤!
我的改法是指向同一字串即Str,如果要產生另一個新的結果字串,
則要先複製輸入的字串或動態配置足夠長的記憶體空間。 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====#####
|
Stallion
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:52 回覆:1600 積分:1995 註冊:2004-09-15
發送簡訊給我
|
插個花! ![]()
< class="code">
char *DeleteEmpty(char *Str)
{
char *tmp; //tmp是(local)區域變數,脫離了函數,就從堆疊消失了,所以不行作為回傳的位址,況且指標沒有初始化,指向哪裡呢?
tmp = new char[strlen(Str)]; //初始化空間
int i=0,x=0;
while(Str[i] != '\0')
{
if(Str[i] != ' ')
{
tmp[x] = Str[i];
x ;
}
i ;
}
tmp[x] = '\0'; //這樣tmp保證不會比Str長吧!
strncpy(Str,tmp,strlen(tmp)); //以原位址回傳
delete tmp;
return Str;
}
-----------------------
Practice makes perfect.
|
evil666
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:3 回覆:4 積分:1 註冊:2004-09-22
發送簡訊給我
|
引言:
插個花!
< class="code">
char *DeleteEmpty(char *Str)
{
char *tmp; //tmp是(local)區域變數,脫離了函數,就從堆疊消失了,所以不行作為回傳的位址,況且指標沒有初始化,指向哪裡呢?
tmp = new char[strlen(Str)]; //初始化空間
int i=0,x=0;
while(Str[i] != '\0')
{
if(Str[i] != ' ')
{
tmp[x] = Str[i];
x ;
}
i ;
}
tmp[x] = '\0'; //這樣tmp保證不會比Str長吧!
strncpy(Str,tmp,strlen(tmp)); //以原位址回傳
//這個地方會出錯?
delete tmp;
return Str;
}
抱歉,小弟貼上程式碼後…會無法執行… 無法使用strncpy()為什麼呢?...
-----------------------
Practice makes perfect.
|
Stallion
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:52 回覆:1600 積分:1995 註冊:2004-09-15
發送簡訊給我
|
#include
你有嗎? ![]() -----------------------
|
evil666
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:3 回覆:4 積分:1 註冊:2004-09-22
發送簡訊給我
|
引言:
#include
你有嗎? -----------------------
>>< face="Verdana, Arial, Helvetica"> 有滴…code如下:
#include
#include using namespace std; char *DeleteEmpty(char *Str)
{
char *tmp = new char[strlen(Str)];
int i=0,x=0; while(Str[i] != '\0')
{
if(Str[i] != ' ')
{
tmp[x] = Str[i];
x ;
}
i ;
}
tmp[x] = '\0';
strncpy(Str,tmp,strlen(tmp));
delete tmp;
return Str;
} int main(void)
{
char *str1="Hello C & C ";
char *str2;
cout << "str1 為:" << str1 << endl;
str2 = DeleteEmpty(str1);
cout << "str2 為:" << str2 << endl;
system("pause");
return 0;
}
compile 完之後,執行程式時會hang住… 發表人 - evil666 於 2005/11/18 23:58:16
|
Stallion
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:52 回覆:1600 積分:1995 註冊:2004-09-15
發送簡訊給我
|
我的沒有問題啊~自己再檢查一下你的環境與COMPILER吧! ![]()
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=25543317&CC=571263"> -----------------------
Practice makes perfect.
|