3110|12

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

【C标准库里那些好玩的东西】strcoll:strcpy的表亲 [复制链接]

 
晚上在看昨天回复的一个帖子,楼主提到“合理使用库函数能否......”



其实有点小感动:还是有人愿意好好研究 C标准库。
因为我自己曾遇到不少人,对C标准库的了解程度和重视程度 低得让人无语。

他们曾说出以下言论:
1.线程锁 和 信号量 只有操作系统才有(甚至有人说只有windows才有)......

还有很多人,因为不知道其实 有 strstr 这些函数,要自己费尽去实现一次,还有人因为不知道其实是有 isalpha isdigit这些函数,还要想着用 ascii 分 0x41(A) 0x30(0)等等诸多方法自己实现一次......

但说到C标准库,好几年前,我一直困惑,所谓 标准C到底是什么?直到后来,我大致理解为 标准C 就是  某个版本的 ansi c标准 cxx + 一个符合该标准的 c compiler + 一个符合该标准的 C标准库。是为 标准C。

但说实话,对于C标准库,我一直只知道
#include 然后就可以愉快的 printf("helloworld");

除此之外我一无所知,直到后来我知道它其实是一个安装在系统里某个地方的一套源码(准确的说是它编译好的库)。

那时候我还不知道原来所谓C标准库的源码也是要收钱的,但是不要紧,后来我知道了有一个叫做 glibc的东西(gcc开源的c标准库)。
我尝试下载过,结果,连怎么把它编译起来都不知道(因为我在windows下,没有make环境)

到后来,我偶然找到一本书,P.J.Plauge 写的一本 C标准库。
我终于找到一本那样的书:详细告诉我C标准库到底有什么,都是按照什么逻辑设计的.......

我真的硬着头皮把这本书看完,最后我得出的结论只有一个:
这书是送给 想要实现一个C标准库的人准备的,而对于要使用它的人,如你我中大多者来说,这书有点像 词典。

从那时起,我就明白了:
也许,我需要的更多的,只不过是 有一个代码,它很小很简单,但是通过实例,告诉我这个东东是干嘛的,是怎么用的(就是使用的时候要注意什么,C库的设计者希望你怎么使用,这很重要——因为没有任何一个函数是任人蹂躏都绝对不会出毛病,哪怕是大名鼎鼎的 C标准库)
此帖出自编程基础论坛

最新回复

非常不错,我第一次听说这个函数,你好好研究,期待继续分享!  详情 回复 发表于 2017-8-17 12:55
点赞 关注
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 
闲话少说,我很久没回来坛子,发帖子了。
先贴上一段代码,我觉得很有意思。
因为,它提及了一个我们可能很多人都很陌生的函数

strcoll.

我在查阅资料时,发现它有一个很好玩的地方。可以对中文按照拼音排序。

我先把 代码贴上来,并且我会在我的win10上,codeblocks运行,测试一下。
但是,我更加感兴趣的是,它在我的MCU上跑起来,会是一个什么情况。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 
  1. #include <stdio.h>

  2. #include <string.h>

  3. #include <stdlib.h>

  4. #include <locale.h>

  5. int main (void)

  6. {

  7.     int i;

  8.     char str[10][4]= {"镕","堃","趙","錢","孫","李","周","吳","鄭","王"};

  9.     qsort (str, 10, 4, strcoll);

  10.     printf ("按内码排序:");

  11.     for (i=0; i<10; i++)

  12.         printf ("%s", str[i]);

  13.     setlocale (LC_ALL, "");

  14.     qsort (str, 10, 4, strcoll);

  15.     printf ("\n按音序排序:");

  16.     for (i=0; i<10; i++)

  17.         printf ("%s", str[i]);

  18.     return 0;

  19. }
复制代码
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 
从结果看,的确如此。

现在我有俩问题:
1.所谓内码是神马?你说英语我可能会猜测是 ascii吗。
但现在是中文,那么,到底是unicode还是 gb2312系列?
2.这个locale显然是C标准库的一部分,那么,按道理,单片机上面也应该没问题,问题是,单片机的C库是经过裁剪的么?
这里其实很有意思,比如 IAR KEIL里,其实你是可以选择不同版本的 库的
它们被命名为 normal full 什么鬼的,这到底是一些什么关系?

PS:相信我,文本处理真的很重要,哪怕是对于单片机,虽然我知道,好多人都很抵触在单片机上使用大量文本。
但是我自己的FreeUI 计划更新的下一版本,就是要采用 纯文本的 UI配置描述。

至于说中文嘛......
我们都是中国人,当然,要说中国话。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

1976

帖子

1

TA的资源

五彩晶圆(初级)

5
 
期待版主的后续内容,我之前也有想过能在MCU上使用的库函数是不是经过裁减的,或者使用上会有什么限制,比如内存大小
此帖出自编程基础论坛
 
 
 

回复

661

帖子

18

TA的资源

纯净的硅(初级)

6
 
好东西,学习学习。谢谢版主!
此帖出自编程基础论坛
 
 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

7
 
output is differnent
  1. admin@admin-PC MINGW64 ~/test
  2. $

  3. admin@admin-PC MINGW64 ~/test
  4. $ cat aa.c
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <locale.h>
  9. int main (void){
  10.     int i;
  11.     char str[10][4]= {"镕","堃","趙","錢","孫","李","周","吳","鄭","王"};
  12.     qsort (str, 10, 4, strcoll);
  13.     printf ("按内码排序:");
  14.     for (i=0; i<10; i++)
  15.         printf ("%s", str[i]);
  16.     setlocale (LC_ALL, "");
  17.     qsort (str, 10, 4, strcoll);
  18.     printf ("\n按音序排序:");
  19.     for (i=0; i<10; i++)
  20.         printf ("%s", str[i]);
  21.     return 0;}
  22. admin@admin-PC MINGW64 ~/test
  23. $ gcc aa.c -o aa.exe
  24. aa.c: 在函数‘main’中:
  25. aa.c:8:24: 警告:传递‘qsort’的第 4 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
  26.      qsort (str, 10, 4, strcoll);
  27.                         ^
  28. In file included from /usr/include/stdio.h:29:0,
  29.                  from aa.c:1:
  30. /usr/include/stdlib.h:139:7: 附注:需要类型‘__compar_fn_t {或称 int (*)(const void *, const void *)}’,但实参的类型为‘int (*)(const char *, const char *)’
  31. _VOID _EXFUN(qsort,(_PTR __base, size_t __nmemb, size_t __size, __compar_fn_t _compar));
  32.        ^
  33. aa.c:13:24: 警告:传递‘qsort’的第 4 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
  34.      qsort (str, 10, 4, strcoll);
  35.                         ^
  36. In file included from /usr/include/stdio.h:29:0,
  37.                  from aa.c:1:
  38. /usr/include/stdlib.h:139:7: 附注:需要类型‘__compar_fn_t {或称 int (*)(const void *, const void *)}’,但实参的类型为‘int (*)(const char *, const char *)’
  39. _VOID _EXFUN(qsort,(_PTR __base, size_t __nmemb, size_t __size, __compar_fn_t _compar));
  40.        ^

  41. admin@admin-PC MINGW64 ~/test
  42. $ ./aa.exe
  43. 按内码排序:吳周堃孫李王趙鄭錢镕
  44. 按音序排序:堃李錢镕孫王吳趙鄭周
  45. admin@admin-PC MINGW64 ~/test
  46. $
复制代码
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

8
 
EETUX 发表于 2017-8-11 09:37
output is differnent
[code]admin@admin-PC MINGW64 ~/test
$

admin@admi ...

咦?
有意思诶......
话说我的MINGW64都没装成功
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

9
 
本帖最后由 EETUX 于 2017-8-11 10:18 编辑

感觉跟.c是utf8还是ansi有关...

11111.PNG (25.69 KB, 下载次数: 0)

11111.PNG
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

10
 
EETUX 发表于 2017-8-11 09:37
output is differnent
[code]admin@admin-PC MINGW64 ~/test
$

admin@admi ...

我在CB下试了试切换编码,开始是 windows965,后来我改成了 utf8
比你还惨,直接显示乱码,而且字数都不一样了。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

11
 
EETUX 发表于 2017-8-11 10:06
感觉跟.c是utf8还是ansi有关...

所以我想你是对的。
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 
晚上吃完饭回来人都跑光了,等到进来时折腾了快一个小时
下次再仔细研究 这个 国际化的 locale库。
涉及很多 iso 格式 的 编码,都不认识,没法看,今晚没时间了
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

6040

帖子

202

TA的资源

版主

13
 
辛昕 发表于 2017-8-14 20:34
晚上吃完饭回来人都跑光了,等到进来时折腾了快一个小时
下次再仔细研究 这个 国际化的 locale库。
涉及 ...

非常不错,我第一次听说这个函数,你好好研究,期待继续分享!
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表