我正在使用strtok()函数将字符串拆分为Tokens。问题是当行中有2个分隔符时。
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,", ");
while (pch != NULL)
{
printf ("Token = %s\n",pch);
pch = strtok (NULL, ", ");
}
return 0;
}
输出:
Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens:
Token = Test=
Token = 0.28
Token = 0.0
Token = 1
Token = 1.9
Token = 2.2
Token = 1.0
Token = 8
Token = 4
Token = 42
有一些简单的方法来获取所有令牌;我需要知道是否有内部分隔符的原因导致我有时间,或者,xxx,
谢谢。
答案 0 :(得分:1)
strtok()
显然与你想要的完全相反。
在线手册中找到:
解析后的两个或多个连续分隔符字节的序列 string被认为是一个单独的分隔符。分隔符字节在 字符串的开头或结尾被忽略。换句话说:代币 由strtok()返回的字符串总是非空字符串。
我实施了strtoke()
- strtok()
的变体,其行为相似但却能满足您的需求:
/* strtoke example */
#include <stdio.h>
#include <string.h>
/* behaves like strtok() except that it returns empty tokens also
*/
char* strtoke(char *str, const char *delim)
{
static char *start = NULL; /* stores string str for consecutive calls */
char *token = NULL; /* found token */
/* assign new start in case */
if (str) start = str;
/* check whether text to parse left */
if (!start) return NULL;
/* remember current start as found token */
token = start;
/* find next occurrence of delim */
start = strpbrk(start, delim);
/* replace delim with terminator and move start to follower */
if (start) *start++ = '\0';
/* done */
return token;
}
int main ()
{
char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtoke(str,", ");
while (pch != NULL)
{
printf ("Token = %s\n",pch);
pch = strtoke(NULL, ", ");
}
return 0;
}
在cygwin上使用gcc进行编译和测试:
$ gcc -o test-strtok test-strtok.c
$ ./test-strtok.exe
Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens:
Token = Test=
Token = 0.28
Token = 0.0
Token = 1
Token =
Token = 1.9
Token = 2.2
Token = 1.0
Token =
Token = 8
Token = 4
Token =
Token =
Token = 42
Token =
Token =
上述链接中的另一个引用:
使用这些功能时要小心。如果您确实使用它们,请注意:
- 这些函数修改了他们的第一个参数。
- 这些函数不能用于常量字符串。
- 分隔字节的标识丢失。
- strtok()函数在解析时使用静态缓冲区,因此它不是线程安全的。如果这对您很重要,请使用strtok_r()。
这些问题也适用于我的strtoke()
。