如何使用strtok_r标记包含空值的字符串

时间:2015-07-20 19:11:29

标签: c string

我有一个包含逗号分隔值的字符串。该值可能为NULL,也可能不为NULL。喜欢:

strcpy(result, "Hello,world,,,wow,");

我也想要接受打印的空值。如何在使用strtok_r时继续进行,这也给了我NULL值。

我试过了:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

    char result[512] = { 0 };
    strcpy(result, "Hello,world,,,wow");
    char *token, *endToken;
    int i = 0;
    token = strtok(result, ",");
    while (i < 5) {
        printf("%d\n", ++i);
        printf("%s\n", token);
        token = strtok(NULL, ",");
    }
    return 0;
}

,输出为:

1
Hello
2
world
3
wow
4
Segmentation fault (core dumped)

我知道为什么会出现Segmentation故障。我想要解决方案,以便输出如下:

1
Hello
2
World
3
*
4
*
5
wow

我希望为空标记打印*,但是甚至不提取空标记。

3 个答案:

答案 0 :(得分:2)

来自strtok_r手册页:

  

解析后的字符串中的两个或多个连续分隔符的序列被视为单个分隔符。

所以它对你的情况不起作用。但你可以使用这样的代码:

#include <stdio.h>
#include <string.h>

int main(void) {
    int i = 0;
    char result[512];
    char *str = result, *ptr;
    strcpy(result, "Hello,world,,,wow");
    while (1) {
        ptr = strchr(str, ',');
        if (ptr != NULL) {
            *ptr = 0;
        }
        printf("%d\n", ++i);
        printf("%s\n", str);
        if (ptr == NULL) {
            break;
        }
        str = ptr + 1;
    }
    return 0;
}

答案 1 :(得分:1)

如果你没有strsep(),你可以自己动手。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {

    char result[512] = "Hello,world,,,wow";
    char *token, *endToken;
    int i = 0;

    token = result;
    do {
        endToken = strchr(token, ',');
        if (endToken)
            *endToken = '\0';           // terminate token
        printf("%d\n", ++i);
        if (*token == '\0')             // substitute the empty string
            printf("*\n");
        else
            printf("%s\n", token);
        if (endToken)
            token = endToken + 1;
    } while (endToken);
    return 0;
}

节目输出:

1
Hello
2
world
3
*
4
*
5
wow

答案 2 :(得分:0)

要使strtok找到令牌,必须有第一个不是分隔符的字符。它只在到达字符串末尾时返回NULL,即当它找到'\0'字符时。

  

要确定令牌的开头和结尾,该函数首先从起始位置扫描未包含在分隔符中的第一个字符(成为令牌的开头)。然后从令牌的开头开始扫描包含在分隔符中的第一个字符,这将成为令牌的结尾。如果找到终止空字符,扫描也会停止。

http://www.cplusplus.com/reference/cstring/strtok