Strtok用法,代码无效

时间:2013-07-27 10:01:04

标签: c 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 个答案:

答案 0 :(得分:10)

有趣的错误!你忘记了功能名称。请注意while循环体内的表达式:

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)永远不会中断,这就是您无限期获得","的原因!