Использование Strtok, код не работает

Я пытаюсь использовать strtok(). Ниже приведен фрагмент кода, который я написал. Он не работает, но печатает ", '" бесконечно.

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

int main(){
char str[]="this, by the way, is a 'sample'";
char *tokens;
tokens = strtok(str, ", '");
//printf("%s\n",tokens);
//printf("%s\n", str);
while(tokens!=NULL)
{
    printf("%s\n", tokens);
    tokens = (NULL, ", '");
}
return 0;
}

Ниже приведен код с справочной страницы strtok(), который отлично работает.

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

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

Я чувствую, что сделал то же самое. Не могу определить ошибку в моем коде. Может кто-нибудь укажет.

Ответы

Ответ 1

Интересная ошибка! Вы забыли имя функции. Обратите внимание на внутреннее тело цикла после выражения:

tokens =  (NULL, ",'");
         ^ 
          'strtok' missing 

должен быть:

tokens = strtok(NULL, ",'");

Интересно, что это не ошибка компиляции, на самом деле:

tokens = (NULL, ",'");

является допустимым выражением, которое равно:

tokens = ",'";

(Примечание: NULL не имеет побочных эффектов)

Читайте: Comma Operator: ,

Оператор запятой , имеет left-to-right associativity. Два выражения разделенные запятой, оцениваются слева направо. Левый операнд всегда оценивается, и все побочные эффекты завершаются до right operand is evaluated.

Из-за скобки ( ) при rhs = после оценки , оператор правой руки "," присваивается token. И поскольку token никогда не назначался NULL, поэтому while(tokens != NULL) никогда не прерывается, и именно по этой причине вы получаете "," бесконечно!