作者freedomceas (呵呵呵...)
看板C_and_CPP
标题[问题] 字串问题...
时间Thu Oct 22 00:29:49 2009
最近遇到一个C语言的问题...感觉满奇怪的...
题目是...如果不在程式码上...设...字串大小...
结果输入一个字串...这样有办法印出来吗???
例如:char *a;
printf("字串:");
fgets(a);
printf("%s",a);
不过这样好像可以编译过...但是打入字串...没有反应...
查了一些书上是说...可以利用副程式来写...
但是...还是写不出来...看看能不能有那位大大...
可以帮忙...谢谢...感激不尽...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.166.26
1F:推 ducksteven:char *a 没有空间让它存放东西,会有 runtime error 10/22 00:32
2F:→ james732:楼上的意思换句话说就是要改成 char a[100]; 10/22 00:36
3F:→ james732:当然大小不一定是100 视你的需求 10/22 00:36
4F:推 ducksteven:我的意思是至少要用 malloc 在 runtime 要空间 10/22 00:38
5F:→ freedomceas:所以要空间大小...也一定要设定罗... 10/22 00:41
6F:→ freedomceas:如果设定大小...输入超过大小的时候...这样就... 10/22 00:43
7F:→ ianfang:当然 不然要放哪 你只有指标阿 10/22 00:43
8F:→ freedomceas:没有办法在输入了... 10/22 00:43
9F:→ freedomceas:我是想说...也可以不用指标...看看有什麽方法... 10/22 00:45
10F:→ freedomceas:可以不用设定大小的状况下...这样比较自由... 10/22 00:46
11F:→ james732:所有的东西都是放在记忆体里 所以当然要分配空间给它 10/22 00:46
12F:→ james732:C++的string类别会包装了这些细节 使用上会比较方便 10/22 00:46
13F:→ james732:如果你的问题是「长度被固定」 就要利用malloc动态分配 10/22 00:47
14F:→ freedomceas:那不能...输入完毕之後...依照输入的多少...分配大小 10/22 00:47
15F:→ james732:你可以研究一下malloc的使用 但是这问题还是挺麻烦的XD 10/22 00:48
16F:→ james732:顺道一提 fgets这类的函式并不安全 10/22 00:49
17F:→ ianfang:没有可以直接用的方法~除非你用STL的string 10/22 00:49
18F:→ ianfang:不然你要自己实做~ 一开始写程式不用想那麽多 设很大就好 10/22 00:51
19F:推 legnaleurc:你不先读入怎麽知道输入的大小?XD 10/22 00:52
20F:→ freedomceas:fgets不安全???那用gets...会比较好吗??? 10/22 00:52
21F:→ ianfang:现在这个不是问题 他是想说buffer overflow吧~ 10/22 00:53
22F:推 ducksteven:未知的输入大小,你就一个字元读,直到换行罗 XD 10/22 00:54
23F:→ freedomceas:设定大小...可能也会遇到浪费的问题... 10/22 00:54
24F:→ freedomceas:所以.输入多少.在给多少空间.比较不会费浪或不够... 10/22 00:55
25F:→ james732:我同意你的想法,不过真的要做到 有一点麻烦 10/22 00:57
26F:推 ianfang:是...但你现在如果还是新手 这不是你该注意的重点 10/22 00:57
27F:→ james732:强烈建议懂了malloc动态配置的使用方式再回来想这个问题 10/22 00:59
28F:→ freedomceas:malloc动态配置...也是需要给定大小... 10/22 01:01
29F:→ ianfang:所以你一个个字元读进来 发现不够放重新malloc 10/22 01:04
30F:→ ianfang:这就是我说你要实做的... 10/22 01:05
31F:→ MOONRAKER:想太多了。 10/22 01:33
32F:→ MOONRAKER:以前本板有一个想不开的新手 每输入一个字元就重新配置 10/22 01:33
33F:→ MOONRAKER:新手想这种问题的下场通常就是那样 10/22 01:34
34F:→ MOONRAKER:现实世界所有的输入buffer都有大小上限 你能做的就是 10/22 01:34
35F:→ MOONRAKER:定一个大小,超过的丢掉,如此而已 10/22 01:35
36F:推 liu2007:stdin 连stdin 都不够的话我看你还是死心吧.... 10/22 09:49
37F:推 ledia:fgets 怎麽会不安全? O_O 10/22 10:13
38F:→ ledia:记忆体为什麽要先配置这个问题要讲可以讲很多 10/22 10:14
39F:→ james732:fgets并不理会buf的长度 因此会造成overflow 10/22 10:14
40F:→ james732:不该说不理会 只是它并没有要求buf长度做为参数 XD 10/22 10:15
41F:→ ledia:一开始就先定固定的值, 之後对整个程式运作原理/作业系统比 10/22 10:15
42F:→ ledia:较熟悉之後会比较有感觉 10/22 10:15
43F:→ ledia:你要不要去看一看 fgets 的参数? ^^: 10/22 10:16
44F:→ ledia:我想你是把 gets 跟 fgets 搞混罗 10/22 10:16
45F:→ james732:真的搞混了 XD 不过原po的范例fgets(a)也让我误会了 XDD 10/22 10:22
46F:推 carlcarl:= =" 10/22 13:17