字元陣列的問題 |
尚未結案
|
lizemountain
一般會員 發表:6 回覆:6 積分:2 註冊:2007-02-14 發送簡訊給我 |
我這個程式是要用來幫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 發送簡訊給我 |
您好:
這個我用BCB好像也會這樣 不知道是連結沒做好還是怎樣 你把他宣告成全域變數看看 而且這個 if 判斷式裡面 怎麼做著個運算 i_buf ; 這是設計好的嗎?
------
恩...
編輯記錄
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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |