[問題] 指標陣列的問題

看板C_and_CPP (C/C++)作者 (膩了新鮮感)時間16年前 (2010/03/10 17:07), 編輯推噓4(4036)
留言40則, 2人參與, 最新討論串3/4 (看更多)
目前我所要解決的問題是要讀入一個txt檔 我用fread讀進buffer後 必須依照文章內的換行符號 分別用陣列來儲存 以下是有問題的code int i=0,j=0; char *line[1024]; char *c; //當找到換行符號的時候進行以下程式 while(iscntrl(buffer)) { c = strchr(buffer, '\n'); i = (int)(c - buffer); //計算出所需大小 line[j]=(char*)malloc (sizeof(char)*i); strncpy(line[j],buffer,i); line[j][i]='\0'; buffer += i+1; j++; } 程式執行的時候所出現的問題是 編譯雖然成功但是什麼output都沒有就跳出來了 能否請版上各位前輩幫我指點一下 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.122.156.177

03/10 17:09, , 1F
單看這段code你也沒印東西, 你希望它跳什麼東西出來??
03/10 17:09, 1F

03/10 17:11, , 2F
剛才想到, 問題文明明有格式, 為什麼不照著格式來~_~
03/10 17:11, 2F

03/10 17:11, , 3F
抱歉我只有貼出有問題的區塊 print沒有寫出來
03/10 17:11, 3F

03/10 17:18, , 4F
你沒有說程式是否執行時有什麼錯誤, 也只有你認為有問題
03/10 17:18, 4F

03/10 17:19, , 5F
的部份code, 也沒有說預期會有什麼結果, 這實在不是一個
03/10 17:19, 5F

03/10 17:20, , 6F
良好的提問方式~_~ 不過, 單就這段code來看, 你的
03/10 17:20, 6F

03/10 17:20, , 7F
line[j][i]的'\0'應該會放超過malloc來的空間@_@"
03/10 17:20, 7F

03/10 17:21, , 8F
真抱歉 因為沒有出現error msg就直接跳出程式了
03/10 17:21, 8F

03/10 17:22, , 9F
不過, 僅管code有這個問題, 沒有error又說沒結果的話,
03/10 17:22, 9F

03/10 17:23, , 10F
八成是main return前沒有暫停下來的機制,
03/10 17:23, 10F

03/10 17:24, , 11F
system("PAUSE"); 有用嗎?? 如果是VC的話有試過改用
03/10 17:24, 11F

03/10 17:25, , 12F
Ctrl+F5來執行嗎?? 你給的資訊越零散不足, 旁人就越難找
03/10 17:25, 12F

03/10 17:25, , 13F
到你的問題點; 這段code是有點問題, 但是不一定跟你提出
03/10 17:25, 13F

03/10 17:26, , 14F
來的疑問其實沒有關係; 以上....~_~
03/10 17:26, 14F

03/10 17:26, , 15F
我用的是dev 在code裡面是有加system("pause")
03/10 17:26, 15F

03/10 17:27, , 16F
line[j][i]='\0'是為了把原本一整行的字元最後的\n換掉
03/10 17:27, 16F

03/10 17:29, , 17F
malloc i個char, 所以line[j]只有[0]~[i-1]可以用@_@"
03/10 17:29, 17F

03/10 17:30, , 18F
V大抱歉 我是因為在寫完這段code的之後原本的程式才執行
03/10 17:30, 18F

03/10 17:30, , 19F
不出來
03/10 17:30, 19F

03/10 17:30, , 20F
所以就覺得應該會是這段程式碼的問題
03/10 17:30, 20F

03/10 17:32, , 21F
剛剛我嘗試了一下 即使malloc多一點結果還是相同= =a
03/10 17:32, 21F

03/10 17:38, , 22F
等等, 是 while( ! iscntrl(buffer) ) 吧?_?
03/10 17:38, 22F

03/10 17:39, , 23F
謝謝V大 但是我剛剛試了一下應該也不是...
03/10 17:39, 23F

03/10 17:40, , 24F
除了!以外, 直接拿buffer餵iscntrl()也是錯的,
03/10 17:40, 24F

03/10 17:40, , 25F
http://0rz.tw/GK5LD 這邊是原本的code
03/10 17:40, 25F

03/10 17:41, , 26F
buffer是個pointer/array, 但iscntrl()吃的是int型態的
03/10 17:41, 26F

03/10 17:42, , 27F
char在判斷的; 說到底純文字, 用fgets()不是很方便嗎Orz
03/10 17:42, 27F

03/10 17:46, , 28F
抱歉我對C的函式還是不太熟 我會在修改看看的 感謝V大
03/10 17:46, 28F

03/10 17:52, , 29F
你的 iscntrl() 使用前沒有#include ctype.h, 因為是.c
03/10 17:52, 29F

03/10 17:52, , 30F
所以運氣好編過了, .cpp就被抓出來func沒宣告了;
03/10 17:52, 30F

03/10 17:53, , 31F
include ctype.h後, 也會抓出你的 iscntrl() 傳入型態不
03/10 17:53, 31F

03/10 17:54, , 32F
對; buffer[bytes]='\0'; 也會踩到用超過array的問題.
03/10 17:54, 32F

03/10 17:54, , 33F
結論, 你要了解 iscntrl() 該怎麼用; 你的array到底能存
03/10 17:54, 33F

03/10 17:55, , 34F
取的範圍在哪(簡單說'\0'怎麼補).
03/10 17:55, 34F

03/10 17:57, , 35F
順便說, 其實我覺得 while+iscntrl() 根本不必要@_@"
03/10 17:57, 35F

03/10 17:59, , 36F
應該是判斷buffer還沒走到底才繼續迴圈.
03/10 17:59, 36F

03/10 17:59, , 37F
又, buffer是malloc回來的空間, 你做過buffer+=i+1; 以
03/10 17:59, 37F

03/10 18:00, , 38F
後, 就等著memory leak了....
03/10 18:00, 38F

03/10 18:00, , 39F
我後來把迴曲改過之後卻還是一樣...相當苦惱= ="
03/10 18:00, 39F

03/10 18:04, , 40F
請問V大我應該是另外在宣告一個指標for buffer嗎?
03/10 18:04, 40F
文章代碼(AID): #1Bbs5A7G (C_and_CPP)
文章代碼(AID): #1Bbs5A7G (C_and_CPP)