【问题标题】:Strtok usage, code not working [duplicate]Strtok用法,代码不起作用[重复]
【发布时间】:2013-07-27 14:49:54
【问题描述】:

我正在尝试使用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;
}

我觉得我做了完全相同的事情。无法找出我的代码中的错误。谁能指出来。

【问题讨论】:

  • 标出此题的副本完全错误!在这个问题中,OP忘记了编码中​​的函数名称,并且由于,逗号运算符的行为没有产生错误而链接的问题是关于运算符的行为。

标签: c strtok


【解决方案1】:

有趣的错误!您忘记了函数名称。注意while循环体内的以下表达式:

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

应该是:

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

有趣的是,这不是编译错误,其实:

tokens = (NULL, ",'");

是一个有效的表达式,它等于:

tokens = ",'";

(注:NULL没有副作用)

阅读:Comma Operator: ,

逗号运算符, 具有left-to-right associativity。两种表达方式 用逗号分隔从左到右求值。左操作数是 总是被评估,并且所有副作用都在right operand is evaluated之前完成。

由于 = 的右方括号 ( ),在评估 , 运算符右侧操作数 "," 后分配给 token。而且因为token 从未分配过NULL,所以while(tokens != NULL) 永远不会中断,这就是您无限获得"," 的原因!

【讨论】:

  • 谢谢兄弟,galti se wrong ho gaya。 :)。 samajh nahi aa raha tha kya galti hai,所以我发布了
  • @naka 没问题,欢迎您!.. 它明显的错误 :) -- 重要的是要了解它编译的原因
  • /*missing calleable-expr*/(expr..., exprn) -- 看哪,"coma-operator"。请注意,在存在重载 operator, 的情况下,结果可能不会评估为 exprn
  • @sehe 是的,这是一个问题,但问题被标记为 c
  • 好点。太糟糕了,它有点破坏了一个很好的笑话:(哦,好吧
猜你喜欢
  • 1970-01-01
  • 2013-02-06
  • 2016-10-02
  • 2018-04-30
  • 1970-01-01
  • 2015-05-09
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多