免费注册 查看新帖 |

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
101 [报告]
发表于 2012-10-10 16:35 |只看该作者
回复 100# mirnshi


    通常不会这么清吧……超长,就应该处理超长的内容,不是么= =

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

如果要处理超长部分,那就接着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
103 [报告]
发表于 2012-10-10 16:46 |只看该作者
回复 102# mirnshi


    好吧………………

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

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

论坛徽章:
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
106 [报告]
发表于 2012-10-10 17:36 |只看该作者
回复 105# pmerofc


    我也不知道诶~~

我基本会把循环交给“下个层次”的语言来做,因为它们更有可能实现SIMD。所以我倾向于能用fgets就不用getchar,除非你需要的功能比fgets更少,从而手写会比SIMD加速版本更快。

另外i,getchar的话,依然是实现几乎跟fgets完全一致的功能,仅仅是省下了strlen和把'\n'改成'\0'的if。但是你得写成一个循环,处理正常字符和EOF,对对应指针进行赋值,最终添加一个'\0',最终结果可能并不能简单多少。也不能减少多少代码。

就输入而言。如果不知道格式,单纯只想要一行的话,用malloc+realloc动态分配几乎是肯定的。要健壮这个逃不掉。如果知道格式可以通过提前分析格式降低需要处理的字符数量。比如scanf直接给出%d这种模式。如果用malloc+realloc的话,fgets是最简单的选择了……

最好的办法是你的程序能直接接受输入。

lua.c(工业级的应用了)里面关于输入是这么做的:
  1. /*
  2. ** lua_readline defines how to show a prompt and then read a line from
  3. ** the standard input.
  4. ** lua_saveline defines how to "save" a read line in a "history".
  5. ** lua_freeline defines how to free a line read by lua_readline.
  6. */
  7. #if defined(LUA_USE_READLINE)

  8. #include <stdio.h>
  9. #include <readline/readline.h>
  10. #include <readline/history.h>
  11. #define lua_readline(L,b,p)        ((void)L, ((b)=readline(p)) != NULL)
  12. #define lua_saveline(L,idx) \
  13.         if (lua_rawlen(L,idx) > 0)  /* non-empty line? */ \
  14.           add_history(lua_tostring(L, idx));  /* add it to history */
  15. #define lua_freeline(L,b)        ((void)L, free(b))

  16. #elif !defined(lua_readline)

  17. #define lua_readline(L,b,p) \
  18.         ((void)L, fputs(p, stdout), fflush(stdout),  /* show prompt */ \
  19.         fgets(b, LUA_MAXINPUT, stdin) != NULL)  /* get line */
  20. #define lua_saveline(L,idx)        { (void)L; (void)idx; }
  21. #define lua_freeline(L,b)        { (void)L; (void)b; }

  22. #endif
复制代码
完全没有管'\n',因为Lua本身自己能处理程序中出现的空白符……

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

论坛徽章:
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
108 [报告]
发表于 2012-10-10 20:19 |只看该作者
本帖最后由 starwing83 于 2012-10-11 00:43 编辑

回复 107# pmerofc


    和fgets的唯一区别就是没有\n么…………这样不好的,你根本不知道后面还有没有内容。

如果你想完成这么一个功能:读取一行的前N个字符,剩下的忽略掉……那下面的函数应该可以……
  1. char *gets_trim(char *s, size_t len) {
  2.     int ch;
  3.     char *origs = s;
  4.     while ((ch = getchar()) != EOF && ch != '\n')
  5.         if (len > 1) *s++ = ch, --len;
  6.     *s = '\0';
  7.     return (ch == EOF && s == origs) ? NULL : origs;
  8. }
复制代码
和你的只有一点点的区别……

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

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
110 [报告]
发表于 2012-10-10 20:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP