Cで不明なサイズのユーザー入力を処理する方法
Cでユーザー入力を処理する2つの例を次に示します。
1. scanf
この方法は、バッファオーバーフローによる攻撃を受けやすいです。バッファオーバーフローとは何かについて、あなたが宣言する以上の文字を入力してみてください。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
scanf("%s", bStr);
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
2. fgets
このメソッドは、文字のユーザー入力を制限することにより、バッファオーバーフローを保護できます。
#include
#include
int main()
{
char bStr[80];
printf("\nEnter a very very very long String value:");
fgets ( bStr, 80, stdin );
printf("\nLong String value:%s \n\n",bStr);
return 0;
}
ただし、上記の2つの方法では、通常のユーザー入力how about i want to handle user input with 1000 or even more charactersのみを処理できますか? はい、「char bStr[1000]」またはそれ以上のサイズのように宣言できますが、これは動的で十分な柔軟性がありません。
溶液
これを修正するには、realloc()を使用してメモリサイズを動的に増やします。 まず、上記の `scanf()`バッファオーバーフローがどのように見えるかを見てみましょう。宣言した内容よりも多く入力するだけで、以下の結果が表示されます。

以下の例では、Cで動的メモリ割り当て(realloc)を使用して、サイズが不明なユーザー入力を処理しています。
#include
#include
int main()
{
unsigned int len_max = 128;
unsigned int current_size = 0;
char *pStr = malloc(len_max);
current_size = len_max;
printf("\nEnter a very very very long String value:");
if(pStr != NULL)
{
int c = EOF;
unsigned int i =0;
//accept user input until hit enter or end of file
while (( c = getchar() ) != '\n' && c != EOF)
{
pStr[i++]=(char)c;
//if i reached maximize size then realloc size
if(i == current_size)
{
current_size = i+len_max;
pStr = realloc(pStr, current_size);
}
}
pStr[i] = '\0';
printf("\nLong String value:%s \n\n",pStr);
//free it
free(pStr);
pStr = NULL;
}
return 0;
}

完了しました。プログラムは未知のサイズのユーザー入力を簡単に処理できます。