C言語のgets関数がエラーで使えない場合の解決策
gets()関数は標準入力から文字列を読み込むC言語の関数ですが、入力文字列の長さが目的文字列の長さを超えることを防ぐ仕組みがなく、バッファオーバーフローを引き起こす可能性があるため安全性の問題があります。そのため、C11以降ではgets()関数は推奨されなくなり、代わりにfgets()関数がより安全な代替として推奨されています。
gets() 関数を引き続き使いたい場合、問題解決のための方法を次に示します。
- C99 規格以前のバージョンのコンパイラが利用できない場合、gets() 関数のサポートを確認してください。
- gets()関数は、ヘッダファイルに宣言されているため、適切にヘッダファイルを含んでいることを確認してください。
- 入力の長さが、対象の文字列の長さよりも大きくないようにしてください。長さを超えると、バッファーオーバーフローを引き起こし、予期しない動作が起こる可能性があります。 gets() 関数を使用する代わりに、fgets() 関数を使用して、対象の文字列の長さを指定しましょう。そうすることで、バッファーオーバーフローを回避できます。
以下は、gets() 関数の代わりに fgets() 関数を使用するサンプルコードです。
#include <stdio.h>
#include <string.h>
int main() {
char str[10];
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
printf("You entered: %s", str);
return 0;
}
標準入力からfgets()関数で文字列を入力する際に、文字列の領域を10に指定していることで、入力された文字数が10を超えたとしても、バッファーオーバーフローを起こさずに済む。