0

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

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

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

free(tofree);

strsep() 由字符串中的任何 sep 字符分隔。在阅读了 strsep() 和 strtok_r() 之后,仍然没有找到。有没有办法在一段时间内做到这一点?任何想法都会有所帮助。塔克斯

4

2 回答 2

0

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

strsep()并且strtok_r()不是ISO/IEC C11 标准定义的功能。

#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;
}
于 2013-03-09T11:57:46.893 回答
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);
}
于 2013-03-09T11:59:58.420 回答