0

次のコードがsegfaultingである理由がわかりません。

char * buffer = "SIZE";
char * tempString;
tempString = strtok(buffer, " ");
if(strcmp(tempString, "SIZE") == 0){    
    tempString = strtok(NULL, " ");           <----Faulting here
}

トークン化するものが残っていないので、tempStringをNULLに等しくするべきではありませんか?よろしくお願いします。

4

2 に答える 2

7

2つの問題があります:

まず、strtok最初のパラメータに変更可能な文字列が必要ですがbuffer、あなたの例ではそうではありません。代わりにこれを試してください:

char buffer[] = "SIZE";

第二に、どちらが戻ることができるかをstrcmp処理しません:NULLstrtok

if (NULL != tempString && strcmp(tempString, "SIZE") == 0)
于 2012-11-27T20:43:12.177 に答える
2

参照にあるように、トークン化された要素を確認するだけです。それに従うと、クリーンなアプローチが得られます。

正しいコード:

char buffer[] = "SIZE";
char * tok;
tok = strtok(buffer, " ");
while(tok != NULL)
{
  if(strcmp(tok, "SIZE") != 0)    
    break;
  tok = strtok(NULL, " ");        //   <----Faulted here
}

はい、バッファ内の複数の「SIZE」ワードをスキップする可能性があるため、最初に行ったものよりも少し多くのことを行いますが、他のプログラマーにとっては読みやすくなります(また、後で思い出しやすくなります)。

于 2012-11-27T21:56:40.773 に答える