C语言 - 使用strtok函数以管道为分隔符切割字符串

3

我有一个字符串"1|4|1577|1|10.22.33|7001390280000019|||||172.20.5.20|1",我想将这个字符串分割并得到以下结果:

1
4
1577
10.22.33
7001390280000019
null
null
null
null
172.20.5.20
1

然而,当我在while循环中使用strtok时,没有任何内容的管道不会显示,因此我的结果如下:

1
4
1577
1
10.22.33
7001390280000019
172.20.5.20
1

我该如何获得这个结果?

以下是我的代码:

int main(argc,argv)
int argc;
char *argv[];
{
    char *var1="1|4|1577|1|10.22.33|7001390280000019|||||172.20.5.20|1";
    char *var2=malloc(strlen(var1)+1);
    strcpy(var2,var1);
    while ((var2 = strtok(var2, "|")) != NULL){
        printf("<<%s>>\n", var2);
        var2= NULL;
    }
    return 0;
}

提前感谢您


1
使用strsep函数。 - BLUEPIXY
感谢所有解答我的疑问,@BLUEPIXY你有使用strsep的例子吗? - Alan Gaytan
即使 strtok 是正确的函数(实际上并不是),使用 var2 也是相当错误的。首先,malloc 应该是 char *var2=malloc(strlen(var1)+1);,但你随后又将 var2=NULL 覆盖,导致它无法被 free。更好的方法是 var2=strdup(var1),但你仍然需要 free(var2) - Weather Vane
@AlanGaytan,OS X的strsep()手册(http://www.unix.com/man-page/osx/3/strsep/)似乎有一个例子可以解决你正在做的事情 :) - mah
2
如果你的系统没有 strsep,可以使用示例实现,或者通过谷歌搜索代码。 - BLUEPIXY
显示剩余7条评论
2个回答

1
这是一个使用 strsepstrdup 的示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char *var1="1|4|1577|1|10.22.33|7001390280000019|||||172.20.5.20|1";
    char *p, *var2, *var3;
    var2=strdup(var1);   // allocates enough space for var1 and copies the contents
    var3=var2;           // save off var2, since strsep changes it
    while ((p = strsep(&var2,"|")) != NULL) {   // p contains the token
        printf("<<%s>>\n", p);
    }
    free(var3);          // var2 is now NULL, so use var3 instead
    return 0;
}

输出:

<<1>>
<<4>>
<<1577>>
<<1>>
<<10.22.33>>
<<7001390280000019>>
<<>>
<<>>
<<>>
<<>>
<<172.20.5.20>>
<<1>>

谢谢提供的示例,但是当我复制代码时,出现了下一个错误:undefined reference to `strsep',是否有什么遗漏? - Alan Gaytan
如果是这种情况,那么 strsep 不可用。你使用的是哪个操作系统和编译器?@AlanGaytan - dbush
我正在使用MinGW,我在C语言方面非常新手,所以我不确定什么是操作系统? - Alan Gaytan
1
如果你正在使用MinGW,那么你是在Windows上,而Windows不支持strsep。请参考BLUEPIXY留下的评论。 - dbush

0
感谢 @BLUEPIXY 和 @dbush,代码最终变成了这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *strsep(char **sp, const char *sep);

int main()
{
    char *var1="1|4|1577|1|10.22.33|7001390280000019|||||172.20.5.20|1";
    char *p, *var2, *var3;
    var2=strdup(var1);   // allocates enough space for var1 and copies the contents
    var3=var2;           // save off var2, since strsep changes it
    while ((p = strsep(&var2,"|")) != NULL) {   // p contains the token
        printf("<<%s>>\n", p);
    }
    free(var3);          // var2 is now NULL, so use var3 instead
    return 0;
}

char *strsep(char **sp, const char *sep){
    char *p, *s;
    if (sp == NULL || *sp == NULL || **sp == '\0') return(NULL);
    s = *sp;
    p = s + strcspn(s, sep);
    if (*p != '\0') *p++ = '\0';
    *sp = p;
    return(s);
}

结果:

<<1>>
<<4>>
<<1577>>
<<1>>
<<10.22.33>>
<<7001390280000019>>
<<>>
<<>>
<<>>
<<>>
<<172.20.5.20>>
<<1>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接