2012-04-04 33 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