C语言基础深入之常用常错函数新读,你会运用吗?

初入职场,才发现自己的C基础是多么的欠缺。晚上加班没事,作为程序员提升自身技术的一部分,走读公司代码,才发现简单的一个功能要是让自己来实现的话,却也是漏洞百出。先说说原有代码的功能,根据MAC地址来更新维护的ARP表。

原理很简单:读取文件“proc/net/arp”,然后对文件内容进行解析,后续进行相应的操作。这里只是根据自己的回忆对模糊的知识点进行总结。新手们可以拿来学习学习,大牛们看看亦可,加深印象,欢迎提意见,喷子就不用来了。

1)打开文件`proc/net/arp`,获取ARP信息。具体如下图:

arp

这里比较简单,需要注意的就是文件操作完毕后记得fclose()释放相关资源。

分享之前我还是要推荐下我自己建的C/C++开发学习群:【二四八,八九四,四三零】,都是学C/C++开发的,如果你正在学习C/C++ ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有C/C++软件开发相关的),包括我自己整理的一份2018最新的C/C++零基础资料和C/C++进阶教程,欢迎进加入前面我写过一篇文章谈了自己的C/C++学习经验(我学C/C++的经验),里面谈到"技巧宛如一颗一颗珍珠",后台有好几个小伙伴留言,能不能分享一些技巧. 其实我的企鹅号里面多多少少分享过一些,今天我分享一些自己私藏的非常不错的技巧和代码给大家,希望对大家有用!

C/C++游戏编程比较系统的学习路线

c语言入门 程序设计-算法-运算符-顺序 分支 循环结构。C语言精通 数组-函数字串符

-指针-构造类型-预处理-存储管理-文件操作-数据结构。c++入门 面对对象编程-类和对象-运算符重载

-派生于继承,异常处理技术-C++语言 11标准-数据结构-(双向链表-双向队列-树-图)。c++精通

stl标准模板库(容器-迭代器-算法)正则表达式-boost标准模板库-socket网络编程-大型企业项目实战:

-员工信息管理系统-推箱子-俄罗斯方块-服务器-播放器-人工智能。windows高级工程师:win32/mfc

-windows高级编程-QT框架编程-大型企业级项目实战项目(人脸识别-车牌识别-局域网远程监控-等项目)

linux系统应用程序开发-linux内核构架研究-linux顶级网络服务器开发及搭建。大型企业项目实战

(linux内核高级虚拟内存驱动设计-linux网络间谍系统软件-linux内核网络数据劫持-linux网络阅读系统开发

等等)上述学习6个月时间左右,如果一天高效率用6个小时学习,加油奋吧,骚年们!

2)getline()按行读取文件内容

gcc扩展定义的函数。

它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。

函数定义如下:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

需要注意的是参数指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放.

3)strtok()使用

字符串分割函数,不可重入,函数原型如下:

char* strtok (char* str,constchar* delimiters );

函数返回值:当s中的字符查找到末尾时,返回NULL;

如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。

请注意,并不是不存在要查找的分隔符时才返回NULL。

4)strtol()函数的使用

完成不同进制之间的转换。

5)ssanf()的使用

其作用是按照固定格式读取字符串。常见的用法相信大家都比较熟悉了,这里简单复习一下。

常见的用法如下:

C++char buf[512] = ;

sscanf("123456 ", "%s", buf);//123456

自己很少用的是有关sscanf中相关正则匹配。

sscanf()函数原型如下:

int sscanf( string str, string fmt, mixed var1, mixed var2 ... );

其中,format可以是一个或多个 {%[*] [width] []type | ' ' | '/t' | '/n' | 非%符号}。

1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

2、表示a,b,c中选一,[d],表示可以有d也可以没有d。

3、width表示读取宽度。

4、:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。5、type :这就很多了,就是%s,%d之类。

6、特别的:%*[width] []type 表示满足该条件的被过滤掉,不会向目标参数中写入值

例如本程序中

sscanf(szLine, "%s%*s%*s%s", szIPAddr, szHWAddr);

将szLine中的第二个,第三个字符串过滤掉。

完整代码如下:

输出结果如下:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180210A0HCAE00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券