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

字元陣列的問題

尚未結案
lizemountain
一般會員


發表:6
回覆:6
積分:2
註冊:2007-02-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-20 19:30:48 IP:140.113.xxx.xxx 訂閱
我這個程式是要用來幫shell分割字串的
把使用者輸入的字串分成個別的參數後存起來
現在遇到兩個問題

1.
我在 parse 中用一個char的陣列來儲存 buf 的字元
用下面的方法可以正常執行, 16、17行可以正常印出字元
可是我想節省空間,於是用改用 11 的宣告方式,卻會出錯
跑單布執行的時,錯誤發生在 16 行,產生了一個Warning視窗
「您的程式引發了存取違規錯誤(Segmentation Fault)」

我仿造這個問題再寫了一個測試的程式(下面那個),卻沒這問題
請問第一個程式是哪裡出了錯?

2.
第一個程式跑出來的結果錯的,我想是因為在30和36行傳回去的都是temp的位址
但是temp的位址從來都沒變,所以arg[0],arg[1]...都會指到同樣的地方,導致大家的內容都一樣
請問有方法讓temp傳回指標後,再給temp一個新的位址嗎?
我用過malloc(),可是似乎會把之前temp的位址給洗掉,所以結果還是錯的

希望大家幫幫忙,謝謝!!

[code cpp]
/*Code 1 for parsing */
#include
#include
#include
#include
#include
#include
#include
#include
int parse(char *buf, char *arg[], int *pipe){

char temp[1024];
// char *temp;
int bufleng = strlen(buf);
int i_buf=0, i_temp=0, i_arg=0, i_pipe=0;

/*測試用的輸出
temp[i_temp] = buf[i_buf];
printf("temp = %c\n",temp[i_temp]);
測試結束*/

for( ; i_buf < bufleng ; i_buf ){

if(buf[i_buf]=='|'){
pipe[i_pipe]=i_buf;
i_buf ;
i_pipe ;
i_temp = 0;
}
else if(buf[i_buf]==' '){
temp[i_temp] = '\0';
arg[i_arg] = temp;
i_arg ;
i_temp = 0;
}
else if(buf[i_buf]=='\n'){
temp[i_temp] = '\0';
arg[i_arg] = temp;
}
else{
temp[i_temp] = buf[i_buf];
i_temp ;
}
}
return i_arg;
};

int main(){
char *arg[10];
char *buf = "ls | cat\n";
int i,count,pipe[9];

count = parse(buf,arg,pipe);

for(i=0;i<=count;i )
printf("arg[%d]=%s\n",i,arg[i]);

system("pause");
return 0;
}

[/code]

[code cpp]
/*Code 2 for testing*/
#include
#include

int main(){

char *temp;
char buf []="ls -al | cat";
int i_temp=0, i_buf=0;

temp[i_temp] = buf[i_buf];
printf("%c\n",temp[0]);

system("pause");
return 0;
}

[/code]

編輯記錄
lizemountain 重新編輯於 2009-10-20 19:45:22, 註解 無‧
istillloving
高階會員


發表:33
回覆:182
積分:183
註冊:2008-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-25 12:49:44 IP:140.127.xxx.xxx 訂閱
您好:


這個我用BCB好像也會這樣 不知道是連結沒做好還是怎樣

你把他宣告成全域變數看看


而且這個 if 判斷式裡面 怎麼做著個運算 i_buf ; 這是設計好的嗎?


  1. if(buf[i_buf]=='|'){
  2. pipe[i_pipe]=i_buf;
  3. i_buf ;
  4. i_pipe ;
  5. i_temp = 0;
  6. }


------
恩...
編輯記錄
istillloving 重新編輯於 2009-10-25 12:55:37, 註解 無‧
istillloving 重新編輯於 2009-10-25 12:55:57, 註解 無‧
istillloving 重新編輯於 2009-10-26 11:36:19, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-26 10:35:10 IP:59.125.xxx.xxx 訂閱
arg[i_arg] = temp;

temp 會隨 function 結束而釋放

===================引 用 lizemountain 文 章===================
我這個程式是要用來幫shell分割字串的
把使用者輸入的字串分成個別的參數後存起來
現在遇到兩個問題

1.
我在 parse 中用一個char的陣列來儲存 buf 的字元
用下面的方法可以正常執行, 16、17行可以正常印出字元
可是我想節省空間,於是用改用 11 的宣告方式,卻會出錯
跑單布執行的時,錯誤發生在 16 行,產生了一個Warning視窗
「您的程式引發了存取違規錯誤(Segmentation Fault)」

我仿造這個問題再寫了一個測試的程式(下面那個),卻沒這問題
請問第一個程式是哪裡出了錯?

2.
第一個程式跑出來的結果錯的,我想是因為在30和36行傳回去的都是temp的位址
但是temp的位址從來都沒變,所以arg[0],arg[1]...都會指到同樣的地方,導致大家的內容都一樣
請問有方法讓temp傳回指標後,再給temp一個新的位址嗎?
我用過malloc(),可是似乎會把之前temp的位址給洗掉,所以結果還是錯的

希望大家幫幫忙,謝謝!!

[code cpp]
/*Code 1 for parsing */
#include
#include
#include
#include
#include
#include
#include
#include
int parse(char *buf, char *arg[], int *pipe){

char temp[1024];
// char *temp;
int bufleng = strlen(buf);
int i_buf=0, i_temp=0, i_arg=0, i_pipe=0;

/*測試用的輸出
temp[i_temp] = buf[i_buf];
printf("temp = %c\n",temp[i_temp]);
測試結束*/

for( ; i_buf < bufleng ; i_buf ){

if(buf[i_buf]=='|'){
pipe[i_pipe]=i_buf;
i_buf ;
i_pipe ;
i_temp = 0;
}
else if(buf[i_buf]==' '){
temp[i_temp] = '\0';
arg[i_arg] = temp;
i_arg ;
i_temp = 0;
}
else if(buf[i_buf]=='\n'){
temp[i_temp] = '\0';
arg[i_arg] = temp;
}
else{
temp[i_temp] = buf[i_buf];
i_temp ;
}
}
return i_arg;
};

int main(){
char *arg[10];
char *buf = "ls | cat\n";
int i,count,pipe[9];

count = parse(buf,arg,pipe);

for(i=0;i<=count;i )
printf("arg[%d]=%s\n",i,arg[i]);

system("pause");
return 0;
}

[/code]

[code cpp]
/*Code 2 for testing*/
#include
#include

int main(){

char *temp;
char buf []="ls -al | cat";
int i_temp=0, i_buf=0;

temp[i_temp] = buf[i_buf];
printf("%c\n",temp[0]);

system("pause");
return 0;
}

[/code]

Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-11-17 19:52:10 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2017-12-15 2:52:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!