-1

を使おうとしています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;
}

私はまったく同じことをしたと感じています。私のコードの障害を理解できません。誰か指摘してください。

4

1 に答える 1

10

面白いバグ!関数名を忘れました。式に続く while ループ本体の内部に注意してください。

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

次のようにする必要があります。

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

興味深いことに、これは実際にはコンパイル エラーではありません。

tokens = (NULL, ",'");

次と等しい有効な式です。

tokens = ",'";

(注:NULL副作用はありません)

読み取り:コンマ演算子:,

コンマ演算子,にはleft-to-right associativity. コンマで区切られた 2 つの式は、左から右に評価されます。左オペランドは常に評価され、すべての副作用は の前に完了しright operand is evaluatedます。

( )の右辺のかっこのため=、演算子の評価後、,右側のオペランド"," が に割り当てられtokenます。そして、token決して割り当てられNULLないのでwhile(tokens != NULL)壊れることはなく、これがあなたが","無限に得ている理由です!

于 2013-07-27T10:02:11.580 に答える