按特定顺序使用strsep()和分隔符?

时间:2013-03-09 11:53:54

标签: c token strsep

我正在尝试使用strsep()解析文本字符串(char *),问题是分隔符必须按顺序使用:第一个标记用','第二个标记':'.. 。

sep = " ,:-,.!.";
tofree = string;

while (token = strsep(&string, " ,:-,.!."))            
{
  validate(token);
}

free(tofree);

strsep()由字符串中的任何sep字符分隔。 在读完strsep()和strtok_r()之后,现在仍然不见了。 有没有办法在一段时间内完成这项工作? 任何想法都会有所帮助。 Thaks

2 个答案:

答案 0 :(得分:0)

您可以strtok()在循环中使用一系列分隔符。

strsep()strtok_r()不是ISO/IEC C11 Standard定义的函数。

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

int separate(const char *data, const char **delims) {
  char *dat = malloc(strlen(data) + 1);
  char *p;
  size_t delimindex = 0;

  if (!dat) return 1;
  strcpy(dat, data);
  p = strtok(dat, delims[delimindex++]);
  while (delims[delimindex] && p) {
    printf("%s\n", p);
    p = strtok(NULL, delims[delimindex++]);
  }
  free(dat);
  return 0;
}

int main(void) {
  const char *delims[] = {" ", ",", ":", "-", ",", ".", "!", ".", NULL};
  const char *test1 = "aaa bbb,ccc:ddd-eee,fff.ggg!hhh.iii";
  const char *test2 = "foobar";
  separate(test1, delims);
  separate(test2, delims);
  return 0;
}

答案 1 :(得分:0)

您可以将分隔符放在一个数组中并逐个使用它们:

const char *seps[] = {
    ",",
    ":",
    "-",
    ",",
    ".",
    "!",
    "."
};

char str[] = "Foo,Bar:Baz-Quirk,Whatever.Foo!Bar.Baz";

char *end;
char *result;

int i;
for (i = 0; i < sizeof(seps) / sizeof(*seps); i++) {
    result = strtok_r(i ? NULL : str, seps[i], &end);
    // do stuff with `result`
    printf("%s\n", result);
}