全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2079
推到 Plurk!
推到 Facebook!

關於指標函數,可除錯但無法執行?

答題得分者是:Stallion
evil666
一般會員


發表:3
回覆:4
積分:1
註冊:2004-09-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-17 01:11:21 IP:61.224.xxx.xxx 未訂閱
大家好~    小弟想請教一下?    關於下面這段小弟的練習。
#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
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-17 16:11:30 IP:140.129.xxx.xxx 未訂閱
evil666 您好: 問題應該是出在: char *tmp; BCB6中嘗試著將其改為: char *tmp = Str; // 指向原字串的開頭 就能執行了! 原因是:宣告char *tmp;但沒有指向或給予足夠字元儲存空間,所以可能發生誤填記憶體的錯誤! 我的改法是指向同一字串即Str,如果要產生另一個新的結果字串, 則要先複製輸入的字串或動態配置足夠長的記憶體空間。 RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-17 20:50:41 IP:211.22.xxx.xxx 未訂閱
插個花! < 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
一般會員


發表:3
回覆:4
積分:1
註冊:2004-09-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-18 01:09:50 IP:61.229.xxx.xxx 未訂閱
引言: 插個花! < 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
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-18 19:39:31 IP:211.22.xxx.xxx 未訂閱
#include 
你有嗎? -----------------------
evil666
一般會員


發表:3
回覆:4
積分:1
註冊:2004-09-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-18 23:56:45 IP:61.229.xxx.xxx 未訂閱
引言:
#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
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-19 08:02:55 IP:211.22.xxx.xxx 未訂閱
我的沒有問題啊~自己再檢查一下你的環境與COMPILER吧! < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=25543317&CC=571263"> ----------------------- Practice makes perfect.
系統時間:2024-11-21 19:35:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!