今日のコンピューターでは、非常に大きな文字列 (数十万文字) を割り当てても、コンピューターの RAM 使用量をほとんど減らすことができません。だから私はあまり心配しません。
ただし、メモリが貴重だった昔は、文字列をチャンクで読み取るのが一般的でした。fgets
入力から最大数の文字を読み取りますが、残りの入力バッファーはそのまま残されるため、好きなように残りを読み取ることができます。
この例では、200 文字のチャンクで読み取りますが、もちろん、任意のチャンク サイズを使用できます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readinput()
{
#define CHUNK 200
char* input = NULL;
char tempbuf[CHUNK];
size_t inputlen = 0, templen = 0;
do {
fgets(tempbuf, CHUNK, stdin);
templen = strlen(tempbuf);
input = realloc(input, inputlen+templen+1);
strcpy(input+inputlen, tempbuf);
inputlen += templen;
} while (templen==CHUNK-1 && tempbuf[CHUNK-2]!='\n');
return input;
}
int main()
{
char* result = readinput();
printf("And the result is [%s]\n", result);
free(result);
return 0;
}
これは、エラー チェックを行わない単純化された例であることに注意してください。実際には、 の戻り値を検証して、入力が問題ないことを確認する必要がありますfgets
。
また、最後に readinput ルーチンの場合、無駄なバイトがないことに注意してください。文字列には、必要な正確なメモリ サイズがあります。