1. ホーム
  2. c

[解決済み] fgets()でstdinから読み込むには?

2022-03-04 18:03:51

質問

ターミナルウィンドウから行を読み取るために以下のコードを書きましたが、問題はコードが無限ループに陥ってしまうことです。行/文の長さは不定なので、バッファに部分的に読み込んでから、それを別の文字列に連結し、それを 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;
}

解決方法は?

ここでは、連結して解決する方法を紹介します。

#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;
}