0

これに対して再帰的方法と反復的方法の両方を試しましたが、不確定な長さの文字列を格納するという問題に直面し続けています。それらがある種のライブラリまたは次の空白まで読み取る Api 呼び出しである場合、非常に役立つことがわかります。

しかし基本的には、文字配列を含む構造体の配列を作成する必要があります。

4

2 に答える 2

2

入力用のスペースを作るために malloc と realloc を使用します。適切な開始サイズを選択します (期待される文字数をある程度把握しておく必要があります)。再割り当てするたびに、サイズを 2 倍にします。

于 2013-02-06T02:18:20.137 に答える
1

この例は、あなたが探していたものを示していると思います。malloc試してみて、freeその動作を発見することをお勧めします。goto のコメントも読んでくださいgoto。それを使用すると、非常に簡単に失敗する可能性があります。次のwhile文字でバッファがオーバーフローするかどうかをifでループした方が良いのですが、面倒だったのでそのままにしました。またご不明な点がございましたら、お尋ねください。

#include <malloc.h>
#include <string.h>

int main( ) {
  unsigned bufferSize = 0; // our array size
  int i = 0; // current position in buffer
  // we allocate memory for our buffer
  char *buffer = (char *)malloc( bufferSize += 10 );

  int ch = EOF; // set to eof, we will use this to buffer input

  // read input until buffer is full
repeat_input:
  for( ; i < bufferSize; i++ ) { // a while loop would be better for this job...
    ch = fgetc( stdin );
    if( ch == ' ' ) {
      // if there is a space we can break here
      goto done; // this is bad coding practice, i am just a bit lazy now
    }
    buffer[ i ] = ch;
  }

  // keep our old buffer pointer to not create a memleak
  char *old_buffer = buffer;
  buffer = (char *)malloc( bufferSize += 10 );

  // copy content of old buffer to new one
  int k = 0;
  for( k = 0; k <= i; k++ ) {
    buffer[ k ] = old_buffer[ k ];
  }

  // free RAM, else we have a memleak
  free( old_buffer );
  goto repeat_input;

done:
  fputs( buffer, stderr );
  free( buffer );
  return 1;
}
于 2013-02-06T02:03:53.177 に答える