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; }
完了しました。プログラムは未知のサイズのユーザー入力を簡単に処理できます。