Re: [問題] 在迴圈裡面重複寫出txt檔

看板C_and_CPP作者 (のヮの)時間9年前 (2014/10/29 02:58), 編輯推噓0(0014)
留言14則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《belle800620 (企鵝)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : C 語言 : 問題(Question): : 想要在迴圈裡面多次輸出不同的檔案 : 但是輸出的檔案名稱其中一部分會隨著變動 : 目前我這樣寫雖然可以輸出多個txt檔 : 但是不知為何名稱變成亂碼@@ : 程式碼如下: : char file_start[15] = "Results_time_"; //這部分名稱是固定的 : char file_end[15] = ".text"; : char order; //這部分名稱會隨著下面迴圈跑到哪裡而改 : for(i=0;i<100;i++) : { : if(i%5==0) //當i除以5為整數時才輸出檔案 : { : order = (char)(i); : string a; : a.assign ( file_start + order + file_end ); : Results = fopen ( a, "w+"); : } : } : 不知道為什麼輸出結果的檔名是一堆亂碼@@... : 先謝謝大家了:) : } 看到開發平台是 C 語言又看到 string 讓我很困惑 XD 我覺得這種東西用 format string 做比較簡單 int i = -1; for (i = 0; i < 100; ++i) { if ((i % 5) == 0) { char file_name[64]; FILE *results = NULL; sprintf(file_name, "Results_time_%d.txt", i); results = fopen(file_name, "w+"); /* ... */ } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.16.246 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1414522726.A.6B9.html

10/29 09:19, , 1F
sprintf()實在
10/29 09:19, 1F

10/29 12:01, , 2F
大概是說sprintf容易有緩衝區溢位的問題;snprintf感覺不錯
10/29 12:01, 2F

10/29 12:54, , 3F
如果要方便的話 c2lib是你的好選擇
10/29 12:54, 3F

10/29 13:19, , 4F
小聲問緩衝區溢位會有什麼問題?
10/29 13:19, 4F

10/29 14:05, , 5F
會覆蓋到記憶體中其他的資料或指令,通常是安全問題
10/29 14:05, 5F

10/29 22:13, , 6F
這個例子要溢位,%d要有46位,超過現存任何系統int大小
10/29 22:13, 6F

10/29 22:14, , 7F
128-bit都不一定可以,太偉大了。
10/29 22:14, 7F

10/29 23:42, , 8F
是指緩衝區溢位攻擊吧
10/29 23:42, 8F

10/29 23:54, , 9F
是啊!這裡的緩衝區就是char[64] 你覺得要怎樣才能擠破
10/29 23:54, 9F

10/29 23:56, , 10F
"Results_time_%d.txt"裡面的%d要多長才會擠破64格?
10/29 23:56, 10F

10/30 00:32, , 11F
沒關係啦,多注意也是好的 XD 這裡真的無可能就是了
10/30 00:32, 11F

10/30 10:43, , 12F
老實講雖然這不會造成overflow, 不過sprintf容易出這種
10/30 10:43, 12F

10/30 10:43, , 13F
包也是事實,在這個點上面放點心眼總是好的
10/30 10:43, 13F

10/30 14:17, , 14F
感謝補充,此例的確不會,我原是想順道題一下sprintf本身而已
10/30 14:17, 14F
文章代碼(AID): #1KJ-TcQv (C_and_CPP)
文章代碼(AID): #1KJ-TcQv (C_and_CPP)