初入職場,才發現自己的C基礎是多麼的欠缺。晚上加班沒事,作為程序員提升自身技術的一部分,走讀公司代碼,才發現簡單的一個功能要是讓自己來實現的話,卻也是漏洞百出。先說說原有代碼的功能,根據MAC地址來更新維護的ARP表。
原理很簡單:讀取文件“proc/net/arp”,然後對文件內容進行解析,後續進行相應的操作。這裡只是根據自己的回憶對模糊的知識點進行總結。新手們可以拿來學習學習,大牛們看看亦可,加深印象,歡迎提意見,噴子就不用來了。
1)打開文件`proc/net/arp`,獲取ARP信息。具體如下圖:
這裡比較簡單,需要注意的就是文件操作完畢後記得fclose()釋放相關資源。
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] = {0};
sscanf("123456 ", "%s", buf);//123456
自己很少用的是有關sscanf中相關正則匹配。
sscanf()函數原型如下:
int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
其中,format可以是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符號}。
1、 * 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中)
2、{a|b|c}表示a,b,c中選一,[d],表示可以有d也可以沒有d。
3、width表示讀取寬度。
4、{h | l | I64 | L}:參數的size,通常h表示單字節size,I表示2字節 size,L表示4字節size(double例外),l64表示8字節size。5、type :這就很多了,就是%s,%d之類。
6、特別的:%*[width] [{h | l | I64 | L}]type 表示滿足該條件的被過濾掉,不會向目標參數中寫入值
例如本程序中
sscanf(szLine, "%s%*s%*s%s", szIPAddr, szHWAddr);
將szLine中的第二個,第三個字符串過濾掉。
完整代碼如下:
輸出結果如下:
閱讀更多 一個程序員的奮鬥史 的文章