【问题标题】:Split a token twice with different delimiter C Code使用不同的分隔符 C 代码将令牌拆分两次
【发布时间】:2019-06-03 07:09:07
【问题描述】:

我试图用 2 个不同的分隔符拆分一个标记,但是在同一个字符串上使用 strtok() 两次会给我带来意想不到的结果。 在第一次 strtok 之后,我想拥有:

0
1
2
3
4;5;6;7
8
9
10

第二次strtok之后:

0
1
2
3
4
5
6
7
8
9
10

这是我的代码:

char *token;
x[0] = {0};
char str[1024] = "0,1,2,3,4;5;6;7,8,9,10;
token = strtok( str, ",');

printf("token is %s\n", token);


//Second 'split'

char *p = strtok (token, ';');
while (p != NULL)
{
    array[z++] = p;
    p = strtok (NULL, seps2);
}

for (int i = 0; i < count + 1; ++i) 
    printf("%s\n", array[i]);

【问题讨论】:

  • 那么,问题出在哪里?
  • man page: 在第一次调用strtok()时,需要在str中指定要解析的字符串。在应解析相同字符串的每个后续调用中,str 必须为 NULL。
  • 什么是arrayx 是什么? seps2 是什么? ...并且有几个语法错误,因此代码无法编译。请修复代码以便它可以编译。
  • 请发minimal reproducible example 来说明问题。
  • 当你声明一个字符数组时,例如char str[] = "0,1,2,3,4;5;6;7,8,9,10; 足以为字符串提供存储空间(包括 nul-termianting 字符)。如果您需要额外的 1004 字符,那么当然,char str[1024] = ... 很好(但我建议定义一个常量,例如 #define MAXC 1024 然后 char str[MAXC] ... 在这种情况下)

标签: c split token


【解决方案1】:

strtok() 的第二个参数是一个字符串,每个字符在对字符串进行标记时被认为是一个分隔符。

所以你可以让你的strtok() 调用成为strtok(str, ",;")

char s[]="0,1,2,3,4;5;6;7,8,9,10";
for(char *tk = strtok(s, ",;"); tk!=NULL; tk=strtok(NULL, ",;"))
{
    printf("%s\n", tk);
}

这种情况下的输出是

0
1
2
3
4
5
6
7
8
9
10

注意strtok() 会修改原始字符串。

【讨论】:

    【解决方案2】:

    如果您使用的是 POSIX 系统,请尝试 strtok_r() (see ideone)。

    否则 (see ideone) 您需要保存来自 strtok(XXX, ",") 的结果并将strtok(XXX, ";") 分别应用于每个结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多