我想知道,我怎么能分开这种字符串。
例如,我有以下字符串:" 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);
}
答案 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