0

関数を使用して、区切り文字としてスペースを含む文字列を読み取っていstrtokます。

私のコードは次のようになります:

char * pch = strtok (text," ");
int i = 0;
while (pch != NULL)
{
  if (i == 0)
     strcpy(name, pch);
  else
     others[i - 1] = pch;
  pch = strtok (NULL, " ");
}

文字列は次のようになります:TCP 1 2 3 4、および関数namechar*受け取る型です。

namebe TCP(つまり、最初の区切り文字の前の最初のピース)に割り当てたいのですが、pchポインターが進行するため、name変数が変更されると変更されpchます。ポインタが変更されたときに変更せずにpchポインタ値を割り当てるにはどうすればよいですか?name

4

3 に答える 3

3

あなたはi++を忘れました。iをインクリメントすることはありません。

于 2012-12-19T13:40:46.560 に答える
2

説明がコードと一致しません。

コードは、ポインターだけでなく、データ(文字)を明確にコピーします。strcpy()後者は次のようになります。

if (i == 0)
  name = pch;

ただし、最初のトークンへのポインターをコピーしたので、それでも機能し、コピーは変更されません。

一方others、配列は、textポインタのみを格納しているため、ループの後に内容が変更されると危険です。

編集:D'oh、他の人が私たちを指摘しているように、あなたは増分iに失敗しています、それは奇妙さを説明するかもしれません。なぜこれを見逃したのかわかりませんが、説明とコードの間の切断についてあまりにも混乱していたと思います。

于 2012-12-19T13:39:49.910 に答える
2

インクリメントすることはないiため、すべてのループでの最新の値がにコピーpchされnameます。

iループの反復ごとにインクリメントすることで修正できます。

char * pch = strtok (text," ");
int i = 0;
while (pch != NULL)
{
  if (i++ == 0) // ++ is the only change from your code
     strcpy(name, pch);
  else
     others[i - 1] = pch;
  pch = strtok (NULL, " ");
}
于 2012-12-19T13:40:42.387 に答える