2012-04-04 32 views
1

我正在編程C使用Linux gcc與-std=c89開關。我有一個變量存儲一個字符串,如:C程序:如何使用循環解析csv字符串?

10, 1, 2, 3 

我展示在上面的字符串4點的整數,但真正的數量並不提前知道。我如何將這些值提取到整數數組中?例如,我們可以使用8的上限來分配內存。但是整數的實際數量將始終是< = 8

目前,我做了以下內容:

sscanf(csv_variable, "%i,%i,%i,%i,%i,%i,%i,%i", 
&int_variable[0], 
&int_variable[1], 
&int_variable[2], 
&int_variable[3], 
&int_variable[4], 
&int_variable[5], 
&int_variable[6], 
&int_variable[7]); 

,但這個工程的有8個整數輸入字符串。想以某種方式在循環內完成解析,以便它可以容納任何數字,例如8個可能的整數(以便它適用於少於8個整數的情況)。

回答

1

只是檢查從sscanf返回找出有多少成功讀取:

int values_read = sscanf(csv_variable, "%i,%i,%i,%i,%i,%i,%i,%i", 
    &int_variable[0], 
    &int_variable[1], 
    &int_variable[2], 
    &int_variable[3], 
    &int_variable[4], 
    &int_variable[5], 
    &int_variable[6], 
    &int_variable[7]); 
+0

非常有趣的答案的字符串。謝謝傑瑞!任何情況下,返回的數值讀取不正確(你可以想到你的頭頂)? – ggkmath 2012-04-04 23:14:08

+0

@ggkmath:不 - 至少在我的使用中,正確跟蹤數字總是非常可靠的。 – 2012-04-04 23:19:46

1

考慮使用strtok函數。它需要字符串,一個是數據,另一個是分隔符。它返回一個指向該標記的指針,所以你只需循環直到返回一個NULL。有一個例子在http://www.elook.org/programming/c/strtok.html

你只需要改變循環有一個計數器,然後索引到你的數組。您可能還想檢查數量與數組中可以容納的數量,以防止數組溢出並覆蓋某些內存。

5

,如果你想這樣做在一個循環中,你可以使用標記化strtok

char *tok = strtok(csv_variable, ","); 
int i = 0; 
while(tok != NULL) { 
    int_variable[i] = atoi(tok); 
    i++; 
    tok = strtok(NULL, ","); 
} 
+2

我已經避免了strtok,因爲在互聯網上有這樣的陳述:「儘管在更高層次上,在使用strtok之前,你真的應該考慮三次。它被棄用,不可重入,並被廣泛認爲是C標準庫中設計最差的函數之一。「http://stackoverflow.com/questions/7100214/strtok-segfault我的應用程序可能更適合或許(?) 。 – ggkmath 2012-04-04 22:49:41

+2

@ggkmath你至少應該知道的一件事是'strtok'修改了原始字符串,並且如果字符串是常量,可能會出錯。您可能應該創建一個不是常量的副本來保留原始字符串。 – twain249 2012-04-04 22:54:07

+0

謝謝@ twain249 – ggkmath 2012-04-04 23:16:24