将字符串拆分为C中的整数数组
我在一个C应用程序中有一个逗号分隔的字符串,我正在将它拆分为一个整数值数组。 该字符串可以包含任意数量的逗号分隔值,因此我也没有数组的初始大小。
例如
"345,3345,35,75,52,386"
并喜欢做类似……
int parsedArray[] = parseString("345,3345,35,75,52,386");
在java或c#中这将是轻而易举的事情但是我认为在谈到C时我有点超出我的深度。有关如何实现这一点的想法?
在C中无法使用post中隐含的签名function,因为函数无法返回动态大小的数组。 这里有两种选择:
- 将数组和最大计数传递给
parseString
,或 - 返回表示动态分配的数组的指针及其实际大小。
第一种方法将数组的大小限制为由调用者建立的某个数字; 第二种方法需要在完成后释放数组。
第一种方法后面的函数如下所示:
void parseString(int data[], size_t maxSize);
第二种方法后面的函数如下所示:
int *parseString(size_t *actualSize);
或者像这样:
void parseString(int ** data, size_t *actualSize);
第二种情况可用于组合这两种方法,尽管API会变得不那么直观。
至于解析本身,存在许多选项。 其中一个“轻量级”选项是使用strtol
,如下所示:
char *end = str; while(*end) { int n = strtol(str, &end, 10); printf("%d\n", n); while (*end == ',') { end++; } str = end; }
演示。
p
是指向字符串的指针
int parsedArray[1024]; int nb = 0; while (nb < sizeof(parsedArray) && *p) { parsedArray[nb++] = strtol(p, &p, 10); if (*p != ',') break; p++; /* skip, */ }
nb
是解析int的数量
我将查看C函数strtok()并使用它来遍历您的字符串并提取每个元素。 使用atoi()将每个元素解析为整数。
#include #include #include int main () { char str[] = "7,4200,4450, 500,1600, 500,550,600"; // Returns first token char *token = strtok(str, ","); int size=atoi(token); int signal[size]; int i=0; // Keep printing tokens while one of the // delimiters present in str[]. while (token != NULL) { printf("%s\n", token); token = strtok(NULL, ","); if(token !=NULL){ signal[i]=atoi(token); printf("%d --", signal[i]); i=i+1; } } return 0; }