如何在c中拆分嵌套的分隔字符串?

时间:2014-11-19 10:46:42

标签: c strtok string-split delimited-text

我想知道,我怎么能分开这种字符串。

例如,我有以下字符串:" 80,8080,27001-27010,90"

我首先想要在逗号处分割,但如果在子字符串中有一个减号我想要拆分它并通过atoi()转换它们来获得两个数字之间的差异。 我要拆分的字符串是一个端口列表,我想生成一个整数数组,枚举所有端口。 strtok函数似乎不适合这个问题,有什么简单的解决方案吗?

使用strtok_r 例如:

 substr1 = strtok_r(portlist, delim1, &saveptr1);
 while(substr1 != NULL){
    substr2 = strtok_r(substr1, delim2, &saveptr2);
    substr1 = strtok_r(NULL, delim2, &saveptr1);
 }

2 个答案:

答案 0 :(得分:2)

在您的特定情况下,您可以使用strchr查找拆分令牌的位置,从而避免失去进度。

另一种方法是使用strtok_r,这是strtok的可重入版本,没有任何内部状态。

修改

strtok_r不是标准C的一部分。它是POSIX.1-2001的一部分。 我认为大多数主要编译器都支持它。在Windows中,相应的函数称为strtok_s。 使便携式移植的好方法是

#if defined(_WIN32) || defined(_WIN64)
/* We are on Windows */
# define strtok_r strtok_s
#endif

如Joachim Pileborgs所述回答 What's the difference between strtok_r and strtok_s in C?

答案 1 :(得分:0)

我更喜欢使用sscanf来解析C

中的字符串
char *text =  "80,8080,,,27001-27010,+tt90";
int p[10];
int offset = 0, i = 0;
char bufDel[32], bufDigit[16];
while (sscanf(text+offset, "%[0-9]%[^0-9]", bufDigit, bufDel) != EOF) {
    offset += strlen(bufDigit) + strlen(bufDel);
    sscanf(bufDigit, "%d", &p[i]);
    ++i;
    bufDigit[0] = '\0';
    bufDel[0] = '\0';
}

%* [^ 0-9]读取除数字0-9之外的所有字符并将其抛弃。 输出是 80 8080 27001 27010 90