[問題] 字串問題...

看板C_and_CPP作者 (呵呵呵...)時間16年前 (2009/10/22 00:29), 編輯推噓8(8038)
留言46則, 9人參與, 最新討論串1/1
最近遇到一個C語言的問題...感覺滿奇怪的... 題目是...如果不在程式碼上...設...字串大小... 結果輸入一個字串...這樣有辦法印出來嗎??? 例如:char *a; printf("字串:"); fgets(a); printf("%s",a); 不過這樣好像可以編譯過...但是打入字串...沒有反應... 查了一些書上是說...可以利用副程式來寫... 但是...還是寫不出來...看看能不能有那位大大... 可以幫忙...謝謝...感激不盡... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.166.26

10/22 00:32, , 1F
char *a 沒有空間讓它存放東西,會有 runtime error
10/22 00:32, 1F

10/22 00:36, , 2F
樓上的意思換句話說就是要改成 char a[100];
10/22 00:36, 2F

10/22 00:36, , 3F
當然大小不一定是100 視你的需求
10/22 00:36, 3F

10/22 00:38, , 4F
我的意思是至少要用 malloc 在 runtime 要空間
10/22 00:38, 4F

10/22 00:41, , 5F
所以要空間大小...也一定要設定囉...
10/22 00:41, 5F

10/22 00:43, , 6F
如果設定大小...輸入超過大小的時候...這樣就...
10/22 00:43, 6F

10/22 00:43, , 7F
當然 不然要放哪 你只有指標阿
10/22 00:43, 7F

10/22 00:43, , 8F
沒有辦法在輸入了...
10/22 00:43, 8F

10/22 00:45, , 9F
我是想說...也可以不用指標...看看有什麼方法...
10/22 00:45, 9F

10/22 00:46, , 10F
可以不用設定大小的狀況下...這樣比較自由...
10/22 00:46, 10F

10/22 00:46, , 11F
所有的東西都是放在記憶體裡 所以當然要分配空間給它
10/22 00:46, 11F

10/22 00:46, , 12F
C++的string類別會包裝了這些細節 使用上會比較方便
10/22 00:46, 12F

10/22 00:47, , 13F
如果你的問題是「長度被固定」 就要利用malloc動態分配
10/22 00:47, 13F

10/22 00:47, , 14F
那不能...輸入完畢之後...依照輸入的多少...分配大小
10/22 00:47, 14F

10/22 00:48, , 15F
你可以研究一下malloc的使用 但是這問題還是挺麻煩的XD
10/22 00:48, 15F

10/22 00:49, , 16F
順道一提 fgets這類的函式並不安全
10/22 00:49, 16F

10/22 00:49, , 17F
沒有可以直接用的方法~除非你用STL的string
10/22 00:49, 17F

10/22 00:51, , 18F
不然你要自己實做~ 一開始寫程式不用想那麼多 設很大就好
10/22 00:51, 18F

10/22 00:52, , 19F
你不先讀入怎麼知道輸入的大小?XD
10/22 00:52, 19F

10/22 00:52, , 20F
fgets不安全???那用gets...會比較好嗎???
10/22 00:52, 20F

10/22 00:53, , 21F
現在這個不是問題 他是想說buffer overflow吧~
10/22 00:53, 21F

10/22 00:54, , 22F
未知的輸入大小,你就一個字元讀,直到換行囉 XD
10/22 00:54, 22F

10/22 00:54, , 23F
設定大小...可能也會遇到浪費的問題...
10/22 00:54, 23F

10/22 00:55, , 24F
所以.輸入多少.在給多少空間.比較不會費浪或不夠...
10/22 00:55, 24F

10/22 00:57, , 25F
我同意你的想法,不過真的要做到 有一點麻煩
10/22 00:57, 25F

10/22 00:57, , 26F
是...但你現在如果還是新手 這不是你該注意的重點
10/22 00:57, 26F

10/22 00:59, , 27F
強烈建議懂了malloc動態配置的使用方式再回來想這個問題
10/22 00:59, 27F

10/22 01:01, , 28F
malloc動態配置...也是需要給定大小...
10/22 01:01, 28F

10/22 01:04, , 29F
所以你一個個字元讀進來 發現不夠放重新malloc
10/22 01:04, 29F

10/22 01:05, , 30F
這就是我說你要實做的...
10/22 01:05, 30F

10/22 01:33, , 31F
想太多了。
10/22 01:33, 31F

10/22 01:33, , 32F
以前本板有一個想不開的新手 每輸入一個字元就重新配置
10/22 01:33, 32F

10/22 01:34, , 33F
新手想這種問題的下場通常就是那樣
10/22 01:34, 33F

10/22 01:34, , 34F
現實世界所有的輸入buffer都有大小上限 你能做的就是
10/22 01:34, 34F

10/22 01:35, , 35F
定一個大小,超過的丟掉,如此而已
10/22 01:35, 35F

10/22 09:49, , 36F
stdin 連stdin 都不夠的話我看你還是死心吧....
10/22 09:49, 36F

10/22 10:13, , 37F
fgets 怎麼會不安全? O_O
10/22 10:13, 37F

10/22 10:14, , 38F
記憶體為什麼要先配置這個問題要講可以講很多
10/22 10:14, 38F

10/22 10:14, , 39F
fgets並不理會buf的長度 因此會造成overflow
10/22 10:14, 39F

10/22 10:15, , 40F
不該說不理會 只是它並沒有要求buf長度做為參數 XD
10/22 10:15, 40F

10/22 10:15, , 41F
一開始就先定固定的值, 之後對整個程式運作原理/作業系統比
10/22 10:15, 41F

10/22 10:15, , 42F
較熟悉之後會比較有感覺
10/22 10:15, 42F

10/22 10:16, , 43F
你要不要去看一看 fgets 的參數? ^^:
10/22 10:16, 43F

10/22 10:16, , 44F
我想你是把 gets 跟 fgets 搞混囉
10/22 10:16, 44F

10/22 10:22, , 45F
真的搞混了 XD 不過原po的範例fgets(a)也讓我誤會了 XDD
10/22 10:22, 45F

10/22 13:17, , 46F
= ="
10/22 13:17, 46F
文章代碼(AID): #1AtpR_kG (C_and_CPP)