2010-10-31 52 views
1

gcc 4.4.4 c89尋找改進點子

有沒有更好的方法來做到這一點?

我有以下代碼從文本文件中讀入。該文本文件包含的行這樣的:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 
7 2 3 4 5 3 7 9 3 2 5 6 

我已經給了只有2行的例子,但還有比這更和每個不同的長度。

我需要做的是將數字放入緩衝區,這樣我就可以對它們進行靜音。這很簡單。

但是,我正在尋找一種解決方案,不會覆蓋每行的緩衝區。所以我的結果緩衝區應該包含以下內容:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 7 2 3 4 5 3 7 9 3 2 5 6 

所以我使用fgets來讀取行,並將該行傳遞給我的分析函數。

但是,我需要for循環中的增量值,以便在最後一個完成時開始。

我已將device_buff設置爲static。這是安全的嗎?我不喜歡在函數中使用靜態變量,因爲它們不是線程安全的並構成全局變量。

int g_load_devices_numbers(void) 
{ 
    fget(line_read, DEVICE_SIZE, fp) == NULL) { 
     analyse_device_numbers(line_read); 
    } 
} 

static void analyse_device_numbers(const char * const device_line) 
{ 
    size_t i = 0; 
    static char device_buff[1024] = {0}; 
    static size_t device_counter = 0; 
    /* Start inserting the last index */ 
    static size_t buff_counter = 0; 

    /* copy each number into the char array 
    * only copy up to the 'return' as fgets always inserts one */ 
    for(i = 0; device_line[i] != '\n'; i++, buff_counter++) { 
     device_buff[buff_counter] = device_line[i]; 
     /* Only count numbers and not spaces */ 
     if(isspace(device_buff[buff_counter]) == 0) { 
      device_counter++; 
     } 
    } 

    /* nul terminate the vote buffer */ 
    device_buff[buff_counter] = '\0'; 

} 

非常感謝您的任何建議,

+0

無需終止device_buff。這完全沒用,因爲你已經掌握了它的長度。空終止只是char *緩衝區能夠提供給字符串操作庫函數(printf,strcpy等)的慣例。 – kriss 2010-10-31 10:32:53

+0

請爲您的問題使用更具描述性的標題。 – 2010-10-31 10:34:32

回答

1

沒有,使用的是靜態緩衝區device_buff是這裏不安全。不是因爲緩衝區本身,而是因爲它的大小有限(1024個項目),所以沒有檢查。

這將是更安全的,以提供作爲輸入參數來analyse_device_numbers其中數據必須被存儲在緩衝器和該緩衝器的長度。必須仍然檢查長度,以避免在提供的緩衝區的最後一個單元格之後進行寫入,並且必須選擇一些錯誤管理約定(例如發生緩衝區溢出時從analyse_device_numbers返回-1)。

爲了總是在相同的目標緩衝器寫慣用的伎倆如果移動提供的緩衝區的開始(考慮到物品已經存儲),並用相同的大寫金額減少的總長度。這可以在調用g_load_device_numbers的外部循環中完成。