c++ でgetsが無くなっていたのでfgetsを使うがそこで止まらない

昔のC言語使いの方であれば1度は使ったことのあるgets()関数
この関数はコマンドプロンプト上で動くプログラムでユーザーの入力した内容を第一引数に
入力する関数なのですが入力される内容が大きい場合、
与える配列の範囲を超えてしまうバッファオーバーフローが発生する関数でした。

この関数について色々調べてみたのですがどうやらC言語の規格c11の段階で
廃止された関数のようです。

その代わりの関数が
fgets()関数
この関数を使った場合、入力内容がどこまで長くても
渡された第二引数の最大値を超えた入力値は切り捨てられ
第一引数に入力されます。
なのでfgets()関数を使うことでバッファオーバーフロー自体はなくなります。

ただ、最大値を超えた入力内容は標準入力のバッファ上に残っているような挙動をしてしまうため
随時入力待ちをさせたい場合は
fgets()関数の後に標準入力を空にするような処理が必要かと思います。

char inp[4]; // 入力内容
fgets(inp, 4, stdin); //キーボードの入力

if (inp[ strlen(inp)-1 ]!= '\n')
 // 
  while (getchar() != '\n');

fgets()を繰り返したときに止まらないことで悩んでいるかたはご参考ください。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です