43

端末ウィンドウから行を読み取るために次のコードを作成しましたが、問題はコードが無限ループに陥ることです。行/文の長さは定義されていないため、バッファに分割して読み込んでから、それに応じて拡張できる別の文字列に連結する予定reallocです。誰かが私の間違いを見つけたり、これを達成するためのより良い方法を提案したりできますか?

#include <stdio.h>
#include <string.h>

#define BUFFERSIZE 10

int main (int argc, char *argv[])
{
    char buffer[BUFFERSIZE];
    printf("Enter a message: \n");
    while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
    {
        printf("%s\n", buffer);
    }
    return 0;
}
4

5 に答える 5

31

ここに連結ソリューション:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 10

int main() {
  char *text = calloc(1,1), buffer[BUFFERSIZE];
  printf("Enter a message: \n");
  while( fgets(buffer, BUFFERSIZE , stdin) ) /* break with ^D or ^Z */
  {
    text = realloc( text, strlen(text)+1+strlen(buffer) );
    if( !text ) ... /* error handling */
    strcat( text, buffer ); /* note a '\n' is appended here everytime */
    printf("%s\n", buffer);
  }
  printf("\ntext:\n%s",text);
  return 0;
}
于 2010-10-12T21:21:30.150 に答える
7

fgets が返すものについて間違った考えを持っています。これを見てください:http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

EOF 文字が見つかった場合は null を返します。上記のプログラムを実行して CTRL+D (または EOF 文字の任意の組み合わせ) を押すと、ループが正常に終了します。

入力の終わりをどのように検出しますか? 改行?ドット(あなたは文xDと言った)?

于 2010-10-12T21:09:57.277 に答える
2

1 行だけを読みたいと仮定するとLINE_MAX、 で定義されている を使用し<limits.h>ます。

#include <stdio.h>
#include <limits.h>
...
char line[LINE_MAX];
...
if (fgets(line, LINE_MAX, stdin) != NULL) {
...
}
...
于 2010-10-12T21:11:50.727 に答える
0

入力を連結する場合は、に置き換えprintf("%s\n", buffer);ますstrcat(big_buffer, buffer);。また、最初に大きなバッファを作成して初期化します: char *big_buffer = new char[BIG_BUFFERSIZE]; big_buffer[0] = '\0';. また、現在のバッファー長に新しいバッファー長を加えた値が制限を超えていないことを確認して、バッファー オーバーランを防ぐ必要がありますif ((strlen(big_buffer) + strlen(buffer)) < BIG_BUFFERSIZE)。変更されたプログラムは次のようになります。

#include <stdio.h>
#include <string.h>

#define BUFFERSIZE 10
#define BIG_BUFFERSIZE 1024

int main (int argc, char *argv[])
{
    char buffer[BUFFERSIZE];
    char *big_buffer = new char[BIG_BUFFERSIZE];
    big_buffer[0] = '\0';
    printf("Enter a message: \n");
    while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
    {
        if ((strlen(big_buffer) + strlen(buffer)) < BIG_BUFFERSIZE)
        {
            strcat(big_buffer, buffer);
        }
    }
    return 0;
}
于 2010-10-12T21:30:48.263 に答える