C программирование strtok - PullRequest
0 голосов
/ 23 февраля 2012

У меня проблемы с функцией strtok. Я продолжаю получать «ошибку автобуса». Я написал функцию, чтобы вернуть все слова в строке. Может ли кто-нибудь указать на мою ошибку?

ПРИМЕЧАНИЕ : я привык к языкам более высокого уровня

void extract_words(char tokens[WORD_MAX][WORD_LEN], char* line, int* sizePtr)
{
  printf("in extract words");   //for debugging

  char* chPtr = NULL;
  chPtr = strtok(line, " ");

  int size = 1;                             //words has one element
  while(chPtr != NULL) 
  {  
     strcpy(tokens[size++], chPtr);
     chPtr = strtok(NULL, " ");               //continue to tokenize the string
  }
  *sizePtr = size;
}

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

strtok изменяет строку, которую вы ей передаете, поэтому он не может быть строковым литералом. Вы должны быть в состоянии сделать что-то вроде этого:

void extract_words(char tokens[WORD_MAX][WORD_LEN], const char* line_arg, int* sizePtr)
{
  char line[(WORD_LEN+1)*WORD_MAX];
  char* chPtr = NULL;
  int size = 0;

  strcpy(line,line_arg);
  printf("in extract words");   //for debugging


  chPtr = strtok(line, " ");

  while(chPtr != NULL) 
  {  
     strcpy(tokens[size++], chPtr);
     chPtr = strtok(NULL, " ");               //continue to tokenize the string
  }
  *sizePtr = size;
}

Обратите внимание, что я также инициализировал размер до нуля, так как индексы массива начинаются с нуля.

0 голосов
/ 23 февраля 2012

Ну ...

Стоит ли использовать разделитель?

В этом случае у меня есть исходный код.

int split(char *src, char *div, char **result,int *size)
{
    int i, j, slen, dlen, key=0, start=0;
    slen=strlen(src);
    dlen=strlen(div);
    for(i=0;i<slen;i++)
    {
        for(j=0;j<dlen;j++)
        {
            if(src[i]==div[j])
            {
                src[i]=0x00;
                result[key] = src+start;
                key++;
                start=i+1;
            }
        }
    }
    result[key]=src+start;
    *size=key+1;
    return 0;
}

с помощью

split (chatData, "", cmpData, & tok);

"": токен & tok: считать разделенное слово chatData: исходные данные

от корейского Дальсама.

...