[問題] 有沒有可能printf出未來?

看板C_and_CPP作者 (hoi)時間13年前 (2011/07/18 17:51), 編輯推噓25(25059)
留言84則, 21人參與, 最新討論串1/1
開發平台(Platform): NetBeans 額外使用到的函數庫(Library Used): No 問題(Question): 我是用PHP exec接收C程式printf回來的陣列值即時顯示在網頁, 在transform裡頭沒有任何印出的指令, 但是神奇的是印出的不只是原始argv[1]傳入的資料, 處理完的字串的部份片段竟然也印出了... 所以才會問未來還沒printf的字串為什麼它可以印出來...Orz 餵入的資料(Input): Hello 預期的正確結果(Expected Output): Hello 錯誤結果(Wrong Output): Hello future 程式碼(Code):(請善用置底文網頁, 記得排版) char *text; if(argv[1]) { text = argv[1]; printf("%s", text); //印出原始字串 text = transform(argv[1]); //字串處理 //printf("%s", text); //印出處理完的字串 } 發生詭異情形的main.c main.c: http://codepad.org/AqwM3OZ8 正常運作的main.c http://codepad.org/wfpAxMsi str.h: http://codepad.org/XVIoNHzM index.php: http://codepad.org/OzHdQlk1 範例輸入: X0+((((((X1-X0)^2+(Y1-Y0)^2)^0.5)^2+R0^2-R1^2)/(2*(((X1-X0)^2+(Y1-Y0)^2)^0.5)))*(X1-X0)-((R0^2-C^2)^0.5)*(Y1-Y0))/(((X1-X0)^2+(Y1-Y0)^2)^0.5); 補充說明(Supplement): 由於印出的結果實在太龐大,下面的結果是我舉例的。 -- 酷酷方盒子 - QQBoxy http://QQBoxy.blogspot.com   -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.130.17.100

07/18 17:58, , 1F
code ....
07/18 17:58, 1F

07/18 17:59, , 2F
code我不是貼了= =?
07/18 17:59, 2F

07/18 18:03, , 3F
可以順便給一下transform吧...
07/18 18:03, 3F

07/18 18:55, , 4F
大概是忘了尾巴加\0
07/18 18:55, 4F

07/18 19:06, , 5F
請問尾巴加\0的意思是?
07/18 19:06, 5F

07/18 19:09, , 6F
結尾字元
07/18 19:09, 6F
※ 編輯: gs1458 來自: 140.130.17.100 (07/18 19:16)

07/18 19:18, , 7F
完整的程式已經附上,敝人只是自學寫的很醜請多多指教。
07/18 19:18, 7F
※ 編輯: gs1458 來自: 140.130.17.100 (07/18 19:28)

07/18 19:29, , 8F
為什麼str.h 要自己刻? 好string.h不用嗎?
07/18 19:29, 8F

07/18 19:32, , 9F
這不是重點吧...
07/18 19:32, 9F

07/18 19:34, , 10F
因為剛學的時候,字串完全不懂,所以就從原始的來學了。
07/18 19:34, 10F

07/18 19:39, , 11F
說真的你沒講我還真的不知道string.h有內建的...
07/18 19:39, 11F

07/18 19:39, , 12F
DON'T INVENT WHEELS AGAIN
07/18 19:39, 12F

07/18 19:39, , 13F
抱歉,DON'T INVENT THE WHEEL AGAIN
07/18 19:39, 13F

07/18 19:39, , 14F
我寫這隻程式的時候,Google第一篇教學就是這個O__O
07/18 19:39, 14F

07/18 19:40, , 15F
當你打hello 不是argc == 2嗎?
07/18 19:40, 15F

07/18 19:44, , 16F
因為網頁輸入模式是丟兩個變數,第一個是判斷要轉換的語言
07/18 19:44, 16F

07/18 19:44, , 17F
第二個是輸入的字串,所以argc會是3唷0.0
07/18 19:44, 17F

07/18 19:56, , 18F
請問您需要PHP程式碼嗎?
07/18 19:56, 18F

07/18 21:03, , 19F
丟上來比較好....
07/18 21:03, 19F

07/18 21:18, , 20F
嗯嗯,已經放上去了 :)
07/18 21:18, 20F
※ 編輯: gs1458 來自: 140.130.17.100 (07/18 21:26) ※ 編輯: gs1458 來自: 140.130.17.100 (07/18 21:59)

07/18 21:57, , 21F
我覺得問題應該不是在C裡....
07/18 21:57, 21F

07/18 21:59, , 22F
我自己是覺得問題在C跟PHP溝通的橋樑出了問題
07/18 21:59, 22F

07/18 22:02, , 23F
我在php.ini有試著調大記憶體大小與執行時間限制,
07/18 22:02, 23F

07/18 22:02, , 24F
恩恩 有可能 以C程序上是沒問題呀
07/18 22:02, 24F

07/18 22:03, , 25F
爬了文查了argv似乎也沒有字串長度限制的問題
07/18 22:03, 25F

07/18 22:09, , 26F
很感謝您花了時間幫我看程式,有高手確認C沒問題,
07/18 22:09, 26F

07/18 22:09, , 27F
這樣我就可以再來查查看是不是其他部分的錯誤了>w<
07/18 22:09, 27F

07/18 22:17, , 28F
argv 確定可以 inplace 改嗎? 試試 copy 一份新的
07/18 22:17, 28F

07/18 22:17, , 29F
我不是高手 我是強大的版友裏面最弱的....
07/18 22:17, 29F

07/18 22:18, , 30F
只是時間比較充裕可以回而已
07/18 22:18, 30F

07/18 22:21, , 31F
我把字串丟給hello = argv[2];再塞進去也不行...ㄒ^ㄒ
07/18 22:21, 31F

07/18 22:28, , 32F
這程式轉換次數不多也就是輸入方程式的次方的總數不多的話
07/18 22:28, 32F

07/18 22:29, , 33F
都能轉換成功,並不是字串的長度太長,而是次方太多個要轉
07/18 22:29, 33F

07/18 22:29, , 34F
的時候才會空白,不曉得有沒有什麼記憶體溢位的問題...
07/18 22:29, 34F

07/18 23:19, , 35F
字串複製請用 strncpy ...
07/18 23:19, 35F

07/18 23:22, , 36F
好的,不過主程式沒用到它 :)
07/18 23:22, 36F

07/19 00:58, , 37F
我沒仔細看code的邏輯,但是建議不要直接修改argv[]
07/19 00:58, 37F

07/19 01:27, , 38F
沒有喔,只有讀取它,並沒有修改它唷0.0
07/19 01:27, 38F

07/19 01:41, , 39F
你什麼時候產生了你沒修改 argv 的幻覺了 ...
07/19 01:41, 39F

07/19 01:43, , 40F
從頭到尾沒看過你有 copy 過字串, 所有的 remove 和
07/19 01:43, 40F

07/19 01:43, , 41F
insert 都是直接修改原字串的 ...
07/19 01:43, 41F

07/19 01:54, , 42F
抱歉我還是不懂,字串到function裡頭後不是只是讀取而已嗎?
07/19 01:54, 42F

07/19 01:56, , 43F
我沒學過記憶體配置相關的知識,真的不了解字串背後到底是
07/19 01:56, 43F

07/19 01:57, , 44F
如何運作的? 我的認知是已經丟給stringFunc這個變數了。
07/19 01:57, 44F

07/19 01:59, , 45F
字串在 C 只是字元陣列, 你傳的一直都是指標, 不是變數
07/19 01:59, 45F

07/19 02:00, , 46F
建議你可以看看關於字串, 陣列和指標的章節
07/19 02:00, 46F

07/19 02:01, , 47F
更正一下上上句, 你傳的是指標變數, 不是複製整個字串
07/19 02:01, 47F

07/19 02:04, , 48F
指標章節我有看過,經您一講我才了解您的意思,
07/19 02:04, 48F

07/19 02:05, , 49F
所以我要利用您說的strncpy先複製一個指標字串,
07/19 02:05, 49F

07/19 02:05, , 50F
再把它扔進function這樣的意思對嗎?
07/19 02:05, 50F

07/19 02:07, , 51F
good~~ 我就是這個意思 :P
07/19 02:07, 51F

07/19 02:11, , 52F
我加了 strncpy(hello,argv[2],sizeof(hello)-1);
07/19 02:11, 52F

07/19 02:12, , 53F
我這樣寫有合乎標準嗎?
07/19 02:12, 53F

07/19 02:13, , 54F
這樣很好 ... 如果 hello 的長度正確應該就沒問題
07/19 02:13, 54F

07/19 02:13, , 55F
雖然問題還是存在這樣,但還是感謝您我又多學到一招了>_<
07/19 02:13, 55F

07/19 02:14, , 56F
hello我還是用了char *hello來宣告,這樣算有複製到嗎?
07/19 02:14, 56F

07/19 02:19, , 57F
參考置底十誡三, 或是直接宣告 char hello[1024];
07/19 02:19, 57F

07/19 02:27, , 58F
我以為置底文那是純粹發文版規沒看,裡頭竟然有教學Orz
07/19 02:27, 58F

07/19 02:49, , 59F
用了置底文的正確例子後輸出還是有問題,
07/19 02:49, 59F

07/19 02:49, , 60F
不過整個程式能夠越來越標準感覺真不錯。
07/19 02:49, 60F

07/19 03:05, , 61F
慢著...天哪...我把它宣告成1024後,竟然成功了...ㄒ^ㄒ
07/19 03:05, 61F

07/19 03:05, , 62F
legnaleurc大大我愛死你啦>"<
07/19 03:05, 62F

07/19 12:55, , 63F
版主快把樓上發言變成版標!!
07/19 12:55, 63F

07/19 20:14, , 64F
版主快把樓上上的發言變成版標+1
07/19 20:14, 64F

07/19 21:06, , 65F
版主快把樓樓樓上的發言變成版標 啾咪><
07/19 21:06, 65F

07/19 22:22, , 66F
板標怎麼怪怪的XDD
07/19 22:22, 66F

07/19 22:40, , 67F
朝聖XD
07/19 22:40, 67F

07/20 01:43, , 68F
有人告白有推
07/20 01:43, 68F

07/20 13:33, , 69F
結果我變成版標 =D=
07/20 13:33, 69F

07/20 13:35, , 70F
樓上 (worship)
07/20 13:35, 70F

07/20 13:38, , 71F
樓上人黑真好薏仁大大(worship)
07/20 13:38, 71F

07/20 13:40, , 72F
xatier是大神!!! 我是他的子弟兵
07/20 13:40, 72F

07/20 14:10, , 73F
朝聖推 (worship)
07/20 14:10, 73F

07/20 14:12, , 74F
樓上大神是我超強學長(worship)
07/20 14:12, 74F

07/20 14:13, , 75F
@amatrrosivi: 這哪招 =D=
07/20 14:13, 75F

07/20 14:51, , 76F
推 xatier:版主快把樓上發言變成版標!!
07/20 14:51, 76F

07/20 15:01, , 77F
連R6學長都...
07/20 15:01, 77F

07/20 17:46, , 78F
朝聖推
07/20 17:46, 78F

07/21 00:06, , 79F
朝聖推
07/21 00:06, 79F

07/21 13:11, , 80F
朝聖推!
07/21 13:11, 80F

07/21 13:12, , 81F
朝聖 (worship)
07/21 13:12, 81F

07/21 19:32, , 82F
看來這邊都被精英份子佔據,收拾包袱去別的論壇TAT
07/21 19:32, 82F

07/28 19:56, , 83F
朝聖推
07/28 19:56, 83F

08/07 01:21, , 84F
朝聖推
08/07 01:21, 84F
文章代碼(AID): #1E908LTv (C_and_CPP)