0

ポインタを使って文章を単語に分割したい。

私はいくつかのコードを書きましたが、セグメンテーション違反が発生するため、本当に混乱しています。親切に私を助けてください。前もって感謝します。

char **breakstring(char *str)
{
    char **temp=(char **)malloc(5*sizeof(char *));
    char **temp_store = temp;
    while((*str) != '/0')
    {
      while((*str != '\0') && *str!=' ')
      {
      **temp=*str;
      **temp++;
      *str++;
      }

      str++;
      temp++;
    }
    return temp_store;
}

int main()
{
    char **arra;
    char *arr="this is a stupid string";
    arra=breakstring(arr);
    return 0;
}
4

2 に答える 2

3

問題はいくつかあります。

この行で:

char **temp=(char **)malloc(2*sizeof(char *));

char *2つのポインタにのみメモリを割り当てているため、2つのワードしか格納できません。しかし、実際にはそれ以上のものを保存しています。

最後の単語を検索しようとしたときに無効なメモリを読み取ろうとしているときの内部whileループは、スペースを見つけようとします' 'が、で終了し'\0'ます。

while(*str!=' ')
{
   **temp=*str;
   **temp++;
   *str++;
}

次のように更新します。

while((*str != '\0') && *str!=' ')
{
   **temp=*str;
   **temp++;
   *str++;
}

temp第三に、更新されたポインタを返します。つまり、最後の単語を指すようにインクリメントおよび変更されています。代わりに、の元の値を返す必要がありますtemp。あなたはこれを行うことができます:

char **breakstring(char *str)
{
    char **temp=(char **)malloc(2*sizeof(char *));
    char **temp_store = temp;
    while((*str) != '/0')
    ....
    return temp_store;
}
于 2012-09-10T04:00:48.007 に答える
1
char **temp=(char **)malloc(2*sizeof(char *));

2つのポインタを割り当てました。入力文字列に3つ以上のスペースがあります。それでもダイナミックメモリを使用したい場合は、定期的に呼び出しreallocてより多くのスペースを要求するか、2より大きい他の任意の最大値を導入する必要があります。

  while(*str!=' ')
  {
**temp=*str;
**temp++;
*str++;
  }

これは、「文字列の現在の文字がスペースではない場合、文字列をに追加して続行しtempます。したがって、呼び出された場合"This is a ..."は、、、"This is a ..."などになります。このループ内で続行します。に割り当てずに。(条件を追加することもできます。つまり)ループの外側では、のようなものが必要になり、すべてのスペース文字をスキップします。(文字列を停止するためにターミネータを追加することもできますが、 '文字列リテラルを使用して関数を呼び出したので、それを維持するには、おそらく文字列全体をヒープにコピーする必要があります。)"his is a ...""is is a ..."strtemp*strwhile (*str && *str != ' ')*temp++ = str;NULconst char *

全体として、ここでリードしているヒープ割り当ての量は、文字列操作の場合、Cとは多少異なります。ヒープ割り当てを返し、定数文字列を渡す代わりに、strsep()(醜いのより良いバージョンstrtok())のようなインターフェースを調べて、呼び出し元のバッファーを変更することをお勧めします。

更新: @Rohanは戻り値の問題についても正しいです。続けて行うtemp++場合は、割り当て開始の元の位置を覚えて、それを返す必要があります。strsepただし、またはを調べることを繰り返しstrtok_rます。

于 2012-09-10T03:55:59.297 に答える