0

strsep()を使用してテキスト文字列(char *)を解析しようとしていますが、問題は、区切り文字を順序で使用する必要があることです。例:最初のトークンは'、' 2番目は':' .. ..

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

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

free(tofree);

strsep()は、文字列内の任意のsep文字で区切ります。strsep()とstrtok_r()の男を読んだ後、まだ今はなくなっています。しばらくの間これを行う方法はありますか?どんなアイデアも役に立ちます。サックス

4

2 に答える 2

0

strtok()ループ内の区切り文字の配列を使用できます。

strsep()およびISO/IECC11標準で定義された機能でstrtok_r()はありません。

#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

セパレータを配列に入れて、1つずつ使用できます。

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 に答える