【Visual Studio 2026|C言語】scanfでエラーC4996が出る原因と対処法

scanfを使ったプログラムをVisual Studio 2026で書いていたら、ビルドした瞬間にエラーが出て動かない…。

C言語の勉強を始めたばかりの時、こんな経験はありませんか?

実は私自身もこのエラーにぶつかりました。本記事では、実際に発生したエラーの内容と、その原因・対処法を整理します。

目次

発生した症状

C言語でキーボードからの入力を受け付けるプログラムを書き、scanfを使ったところ、ビルド時に以下のようなエラーが発生しました。

scanfによるエラー画像とテキスト文
  • エラー画像
  • テキスト文
    • C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

日本語に訳すと「scanfは安全でない可能性があります。代わりにscanf_sの使用を検討してください」という内容です。プログラムはビルドが止まってしまい、実行すらできません。

原因

このエラーは、Microsoftのコンパイラ(Visual C++)が独自に設けているセキュリティチェックによるものです。

scanfは、読み込む文字数を制限せずに変数へ書き込んでしまう可能性がある関数です。たとえばscanf("%s", buf)のような書き方だと、想定より長い文字列が入力された場合に、bufという領域からあふれて他のメモリ領域を上書きしてしまう(バッファオーバーフロー)危険性があります。

Microsoftはこれを問題視し、より安全な代替関数(scanf_sなど、末尾に_sが付く関数群)を用意しています。
そのうえで、Visual Studioでは標準のscanfを使おうとすると警告(C4996)を出す仕様にしています。

scanf以外にも同様な関数があり、以下のMicrosoftのサイトで公開されています。
https://learn.microsoft.com/en-us/cpp/c-runtime-library/security-enhanced-versions-of-crt-functions?view=msvc-170

C言語の入門書や他の環境(Linux、Macなど)では標準のscanfがそのまま使えることが多いため、「本に書いてある通りに書いたのに動かない」と戸惑うポイントになりやすいです。

対処法(今回採用): #define _CRT_SECURE_NO_WARNINGS

今回は、ソースコードの一番上に以下の1行を追加することでこのエラーを解消しました。

#define _CRT_SECURE_NO_WARNINGS

このマクロは、Microsoftの「非推奨」警告(C4996)そのものを無効化するものです。これを書いておくことで、標準のscanfをそのまま使い続けることができます。

注意点が1つあります。 このマクロは#include <stdio.h>よりに書く必要があります。後に書くと効果がないので、順番に気をつけてください。

他の対処法との比較

_CRT_SECURE_NO_WARNINGS以外にも、対処法はいくつかあります。

スクロールできます
対処法内容特徴
_CRT_SECURE_NO_WARNINGSマクロ(今回採用)警告を無効化し、標準のscanfを使い続ける手軽
他の環境(Linux等)でも通用する
バッファオーバーフロー等の対策が必要
scanf_sに置き換えるMicrosoft推奨の安全な関数に書き換えるMicrosoftの想定通りの安全性が得られる
scanfから引数が追加になり、書き方が変わる
Visual Studio以外の環境では基本的に使えない
SDLチェックを無効化プロジェクトのプロパティ
→「C/C++」
→「全般」
→「SDL チェック」を「いいえ」に変更
プロジェクト全体で、scanf以外の関連警告(gets、strcpy等)もまとめて解消できる
影響範囲が広い
対処法の比較

SDLチェックを無効化する際の設定画面です⇩

どれを選ぶべきか

正直なところ、どれが「絶対の正解」ということはなく、目的次第だと思います。

  • 学習用途で、いろんな環境で動くコードを書く練習をしたい
     → _CRT_SECURE_NO_WARNINGSマクロがおすすめです。標準の書き方のまま進められます
  • Visual Studio・Windows専用と割り切って、Microsoft推奨の書き方を学びたい
     → scanf_sへの置き換えがおすすめです
  • プロジェクトが大きく、複数のファイルでscanfやgetsなどを多用している
     → SDLチェックの無効化が手間を省けます

私自身は、C言語の入門書やオンライン上の情報の多くが標準のscanfを前提にしていることもあり、移植性を優先して_CRT_SECURE_NO_WARNINGSマクロを選びました。

参考:GitHubCopilotに修正を依頼した場合

GitHub Copilot に修正を依頼することも可能

Visual Studio 2026では、GitHub Copilot に修正を依頼することも可能です。

エラーメッセージの左側にキラキラしたマークがあり、カーソルを当てると「Copilotに説明と修正を依頼する」というメッセージが表示されます。

GitHub Copilot に修正を依頼した結果

Chatで修正が依頼されました。

コードを自動で修正するところまでやってくれます(「元に戻す」ボタンで戻すこともできます)。

今回は「scanf_sへの置き換え」で対応するよう修正されました。

まとめ

  • C4996エラーは、Microsoftの独自のセキュリティチェックによって、標準のscanfが「安全でない」と判定されることで発生する
  • 最も手軽な対処法は、#include <stdio.h>より前に#define _CRT_SECURE_NO_WARNINGSを書くこと
  • 他にもscanf_sへの置き換えや、SDLチェックの無効化という選択肢もある
  • どれを選ぶかは、移植性を優先するか、Microsoft推奨の書き方に寄せるか、といった目的次第

最後まで読んでいただき、ありがとうございました!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次