C語言基礎深入之常用常錯函數新讀

初入職場,才發現自己的C基礎是多麼的欠缺。晚上加班沒事,作為程序員提升自身技術的一部分,走讀公司代碼,才發現簡單的一個功能要是讓自己來實現的話,卻也是漏洞百出。先說說原有代碼的功能,根據MAC地址來更新維護的ARP表。

原理很簡單:讀取文件“proc/net/arp”,然後對文件內容進行解析,後續進行相應的操作。這裡只是根據自己的回憶對模糊的知識點進行總結。新手們可以拿來學習學習,大牛們看看亦可,加深印象,歡迎提意見,噴子就不用來了。

1)打開文件`proc/net/arp`,獲取ARP信息。具體如下圖:

C語言基礎深入之常用常錯函數新讀

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中的第二個,第三個字符串過濾掉。

完整代碼如下:

C語言基礎深入之常用常錯函數新讀

輸出結果如下:

C語言基礎深入之常用常錯函數新讀


分享到:


相關文章: