Как разбить строку на токены в C? - PullRequest
7 голосов
/ 19 января 2010

Как разбить строку на токены по '&' в C?

Ответы [ 3 ]

13 голосов
/ 19 января 2010

strtok / strtok_r

char *token;
char *state;

for (token = strtok_r(input, "&", &state);
     token != NULL;
     token = strtok_r(NULL, "&", &state))
{
    ...
}
8 голосов
/ 19 января 2010

Я бы сделал это примерно так (используя strchr()):

#include <string.h>

char *data = "this&&that&other";
char *next;
char *curr = data;
while ((next = strchr(curr, '&')) != NULL) {
    /* process curr to next-1 */
    curr = next + 1;
}
/* process the remaining string (the last token) */

strchr(const char *s, int c) возвращает указатель на следующее местоположение c в s или NULL, если c не найдено в s.

Вы можете использовать strtok(), но мне не нравится strtok(), потому что:

  • он изменяет токенизируемую строку, поэтому он не работает для литеральных строк или не очень полезен, если вы хотите сохранить строку для других целей. В этом случае вы должны сначала скопировать строку во временную.
  • объединяет смежные разделители, поэтому, если ваша строка была "a&&b&c", возвращаемыми токенами будут "a", "b" и "c". Обратите внимание, что после "a".
  • это не потокобезопасно.
2 голосов
/ 19 января 2010

Вы можете использовать функцию strok (), как показано в примере ниже.

/// Function to parse a string in separate tokens 

int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter,
                   char *pToken[MAX_TOKENS])
{
  int i;
  i = 0;

  pToken[i] = strtok(pInputString, Delimiter);
  i++;

  while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){
     i++;
  }
  return i;
}

/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string.

sprintf(String,"Token1&Token2");
NrOfParameters = parse_string(String,"&",pTokens);

sprintf("%s, %s",pToken[0],pToken[1]);
...