免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mirnshi
打印 上一主题 下一主题

[C] 《C程序设计伴侣》里的月薪10000的代码 [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
81 [报告]
发表于 2012-10-09 22:29 |只看该作者
回复 80# pmerofc


    我觉得倒是够了,只需要你自己能处理\n即可。perl的方案是一个trim函数,你可以让你的处理方式是whitespace-clean的就行了。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
82 [报告]
发表于 2012-10-09 22:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
83 [报告]
发表于 2012-10-09 22:50 |只看该作者
回复 22# lancer31


    赞一个

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
84 [报告]
发表于 2012-10-09 22:53 |只看该作者
回复 81# starwing83

fgets是取代gets的最简单的方式,而且功能上最近。
另一种方式就是用scanf了,稍微复杂一些。
   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
85 [报告]
发表于 2012-10-09 23:09 |只看该作者
回复 82# pmerofc


    学一下APUE。

单独起一章论述gets的坏处,最后给一个简单的安全实现,比如叫readline吧,自己实现一个超级简单的。接口可以这么设计:

  1. char *readline(const char *prompt);
复制代码
返回的指针是个内存,你可以自行free掉。

然后以后的章节,就直接包含#include "readline.h"即可。

然后你可以在网上提供已经写好的代码包神马的。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
86 [报告]
发表于 2012-10-09 23:18 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
87 [报告]
发表于 2012-10-09 23:37 |只看该作者
回复 86# pmerofc


    这里有个非常简单的readline实现,应该很容易解释吧?
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #define RL_BLOCKSIZE   80

  5. char *readline(const char *prompt) {
  6.     char *buff = (char*)malloc(RL_BLOCKSIZE);
  7.     size_t capacity = RL_BLOCKSIZE;
  8.     size_t len = 0;

  9.     printf("%s", prompt != NULL ? prompt : "> ");

  10.     while (fgets(buff + len, capacity - len, stdin) != NULL) {
  11.         char *newbuff;
  12.         if ((len += strlen(buff + len)) != capacity - 1) {
  13.             if (buff[len - 1] == '\n')
  14.                 buff[len - 1] = '\0';
  15.             return buff;
  16.         }
  17.         if ((newbuff = realloc(buff, capacity*=2)) == NULL)
  18.             break;
  19.         buff = newbuff;
  20.     }

  21.     free(buff);
  22.     return NULL;
  23. }

  24. /* usage */

  25. int main(void)
  26. {
  27.     char *s;
  28.     while ((s = readline(NULL)) != NULL) {
  29.         printf("s = %s\n", s);
  30.         free(s);
  31.     }
  32.     return 0;
  33. }
复制代码

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
88 [报告]
发表于 2012-10-10 09:35 |只看该作者
starwing83 发表于 2012-10-09 23:37
回复 86# pmerofc


C很灵活,解决问题的方法很多,为了解决gets问题,readline这条路稍微有些长了。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
89 [报告]
发表于 2012-10-10 10:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
90 [报告]
发表于 2012-10-10 11:05 |只看该作者
本帖最后由 starwing83 于 2012-10-10 11:07 编辑

回复 89# pmerofc


    其实写书也并非非要严格的介绍所有的细节,你可以这么写:

因为gets的不安全性,所以在实际的代码中,当需要用户输入完整的一行时,我们会使用其他的函数来达到这个目的。一个实际的例子是由libreadline库提供的readline函数。这个函数会返回一个包含了动态分配的、用户完整输入的行的指针。本书的附录A给出了一个最简单的readline的实现,如果要编译本书中给出的例子,直接将这个函数粘贴到文件的最开始即可。大家在学习C语言的大部分知识点以后,可以去附录A大致了解这个函数是如何实现的。以后当我们的代码需要处理用户整行的输入时,都会使用这个函数。现在你只需要知道有这么一个函数可以安全地完成你想要的功能就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP