2017-05-08 156 views
-2

我正在嘗試從Linux文件「/ proc/net/dev」中獲取網絡接口名稱。我有兩個問題。首先,我可以通過編寫從第3行的代碼,直到文件的末尾得到它:由於malloc導致分段錯誤

char buffer[100], word[10]; 
    fgets(buffer, 100, fp); 
    sscanf(buffer, "%s %*[:] %*s", word); 

,但問題是我得到的字符串以冒號(LO:爲eth0:eth1的:)。我怎樣才能以我可以在屏幕上顯示的方式獲取它們。

第二個問題是,爲什麼我得到一個分段錯誤在下面的代碼:

#include <stdio.h> 
#include <stdlib.h> 

#define NETFILE "/proc/net/dev" 

static char **interface_names; 

int counting_lines() 
{ 
    FILE *fp = fopen(NETFILE, "r"); 
    int i = 0; 
    char buffer[200]; 

    while (fgets(buffer, sizeof(buffer), fp) != NULL) 
    { 
     i++; 
    } 
    fclose(fp); 
    return i; 
} 

void do_malloc() 
{ 
    int i; 
    int lines = counting_lines() - 2; 

    interface_names = (char **)malloc(lines * sizeof(char *)); 

    for (i = 0; i < lines; i++) 
    { 
     interface_names[i] = (char *)malloc(10 * sizeof(char)); 
    } 
} 

void free_malloc() 
{ 
    int i; 

    for (i = 0; i < (counting_lines() - 2); i++) 
    { 
     free(interface_names[i]); 
    } 
    free(interface_names); 
} 

void get_interface_names() 
{ 
    FILE *fp = fopen(NETFILE, "r"); 
    int i = -2; 
    char buffer[100]; 

    while (!feof(fp)) 
    { 
     if (i < 0) 
     { 
      i++; 
      continue; 
     } 
     else 
     { 
      fgets(buffer, 100, fp); 
      sscanf(buffer, "%s %*[:] %*s", interface_names[i]); 
      i++; 
     } 
    } 
    fclose(fp); 
} 

int main() 
{ 
    do_malloc(); 
    get_interface_names(); 
    printf("%s\n", interface_names[0]); 
    printf("%d\n", counting_lines()); 
    free_malloc(); 
    return EXIT_SUCCESS; 
} 
+2

每個問題請提出一個問題。 –

+5

'while(!feof(fp))'總是無法檢測到最後一個項目。你會在列表的最後列出重複項。 –

+0

改爲使用'strsep()'。 – 0andriy

回答

1

sscanf模式是錯誤的。它應該是:

 sscanf(buffer, " %9[^:] ", interface_names[i]); 

開頭處的空格跳過行首的任何空格。然後解析任何內容到下一個:並將其放入interface_names[i],最多允許9個字符(因爲interface_names[i]是10個字節)。