C LANGUAGE TECHNOLOGY

【C言語】sprintf/snprintf/sprintf_s関数の使い方

悩んでいる人

C言語でsprintf関数の使い方を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

sprintf関数

sprintf関数は,formatに従って出力を文字列strに書き込む関数です.

※printf関数は標準出力に書き込きます.

sprintf関数の他の部分(書式や戻り値)はprintf関数と同様です.

sprintf関数を利用するコードは以下になります.

実行結果は以下になります.

複数の変数(int型,double型,char型の配列)を文字列に変換できていることがわかります.

sprintf関数の注意点として,バッファサイズより長い文字をstrに書き込むとバッファオーバーフローが発生してしまいます.

sprintf.cのBUFSIZEを64から16に変更したコードは以下になります.

実行結果は以下になります.

コンパイル時に警告が発生し(2~11行目),実行時にバッファオーバーフロー「*** stack smashing detected ***: terminated」が発生していることがわかります(14行目).

snprintf関数

snprintf関数は,最大でsizeバイトをstrに書き込む関数です.

sizeには文字列を終端する'\0'もを含まれます.

sprintf関数とは異なり,snprintf関数はバッファオーバーフローを回避することができます.

sprintf2.cのsprintf関数をsnprintf関数に変更したコードは以下になります.

実行結果は以下になります.

コンパイル時の警告は同様に発生しますが,実行時に「i = 123, d = 3.」と出力する文字数を'\0'文字を含めて16文字以内にすることで,バッファオーバーフローを回避できていることがわかります.

sprintf_s関数

sprintf_s関数は,sprintf関数にセキュリティ機能を追加したC11規格の関数です.

sprintf/snprintf関数とは異なり,sprintf_s関数はバッファオーバーフローが発生する場合,エラーコードを返して終了します.

これにより,バッファオーバーフローの発生を正常に検知することができます.

sprintf_s関数はVisual Studioでは利用できますが,GCC/Clangでは利用できないことに注意して下さい.

sprintf2.cのsprintf関数をsprintf_s関数に変更したコードは以下になります.

Visual Studioでの実行結果は以下になります.

バッファオーバーフローが発生し,コード3を返して終了していることがわかります.

まとめ

C言語でsprintf関数と,派生関数のsnprintf/sprintf_s関数の使い方を紹介しました.

sprintf関数はバッファオーバーフローが発生してしまいますが,snprintf/sprintf_s関数はバッファオーバーフローを回避/検知できます.

また,sprintf_s関数はGCC/Clangでは利用できないこと,Visual Studioで利用できることを覚えておきましょう!

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , ,