2010年12月24日 星期五

sscanf

今天遇到了要去抓某個interface的tx/rx數量的問題, 以前最常用的方法就利用多次的strtok_r去抓到自己要的欄位, 其實, sscanf有時候可以更簡單的達成這個目的, 但是過去苦於看不懂他format的用法, 而沒有利用sscanf來做, 但看完"sscanf 函數用法"後, 總算對sscanf表示式的寫法多了點概念.

在Linux上, 各個network interface的統計資料會被記錄在"/proc/net/dev"裡面
Receive/Transmit bytes分別位於第2欄與第10欄
假設經把eth0那列的string都存到buf內
用strtok來做
void eth_statistics_parser_strtok(char *buf)
{
        char *ptr=NULL, *saveptr=NULL;
        unsigned long tx=0, rx=0;

        strtok_r(buf, ":", &saveptr);
        ptr = strtok_r(NULL, " ", &saveptr);
        rx = atol(ptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        strtok_r(NULL, " ", &saveptr);
        ptr = strtok_r(NULL, " ", &saveptr);
        tx = atol(ptr);

        printf("Rx Bytes: %d; Tx Bytes: %d\n", rx, tx);
}
用sscanf
void eth_statistics_parser_sscanf(char *buf)
{
        unsigned long tx=0, rx=0;
        //sscanf(buf, "%*s%lu%*s%*s%*s%*s%*s%*s%*s%lu", &rx, &tx);
        sscanf(buf, "%*[^:]:%lu%*s%*s%*s%*s%*s%*s%*s%lu", &rx, &tx);

        printf("Rx Bytes: %d; Tx Bytes: %d\n", rx, tx);
}
雖然不知道有沒有比較好, 但是看起來酷很多.


參考資料:
[1] sscanf 函數用法

沒有留言:

張貼留言