初入职场,才发现自己的C基础是多么的欠缺。晚上加班没事,作为程序员提升自身技术的一部分,走读公司代码,才发现简单的一个功能要是让自己来实现的话,却也是漏洞百出。
先说说原有代码的功能,根据MAC地址来更新维护的ARP表。
原理很简单:读取文件“proc/net/arp”,然后对文件内容进行解析,后续进行相应的操作。这里只是根据自己的回忆对模糊的知识点进行总结。
1)打开文件,获取ARP信息。具体如下图:
这里比较简单,需要注意的就是文件操作完毕后记得释放相关资源。
2)按行读取文件内容
gcc扩展定义的函数。
它会生成一个包含一串从输入流读入的字符的字符串,直到以下情况发生会导致生成的此字符串结束。1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
函数定义如下:
需要注意的是参数指向存放该行字符的指针,如果是NULL,则有系统帮助malloc,请在使用完成后free释放。
3)使用
字符串分割函数,不可重入,函数原型如下:
函数返回值:
当s中的字符查找到末尾时,返回NULL;
如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。
请注意,并不是不存在要查找的分隔符时才返回NULL。
4)函数的使用
完成不同进制之间的转换。
5)的使用
其作用是按照固定格式读取字符串。常见的用法相信大家都比较熟悉了,这里简单复习一下。常见的用法如下:
自己很少用的是有关中相关正则匹配。sscanf()函数原型如下:
其中,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 表示满足该条件的被过滤掉,不会向目标参数中写入值
例如本程序中
将szLine中的第二个,第三个字符串过滤掉。
完整代码如下:
函数运行结果如下:
领取专属 10元无门槛券
私享最新 技术干货