「sprintf」の版間の差分
提供: C++入門
(ページの作成:「sprintf とは、フォーマットしたデータを文字列に書き込む関数です。printf のようにフォーマット指定子でフォーマットした...」) |
(相違点なし)
|
2015年11月3日 (火) 15:42時点における最新版
sprintf とは、フォーマットしたデータを文字列に書き込む関数です。printf のようにフォーマット指定子でフォーマットした文字列を標準出力ではなく、第一引数のバッファに書き込みます。
読み方
- sprintf
- えす ぷりんとえふ
目次
概要
sprintfは、第一引数のバッファサイズの指定ができないため、どうしても、sprintf が利用したい場合は、snprintf() を利用してください。
C++言語を使用しているのに、なぜ、C言語の関数を利用しているのか?と考えている方には、 boost::format() をおすすめします。
インストール
標準ライブラリに含まれているため、インストールが不要です。
ヘッダファイル
#include <cstdio> //#include <stdio.h>
ソースコード
下記のプログラムは、C言語のソースコードとまったく同じコードです。
/* * sprintf1.cpp * Copyright (C) 2015 kaoru <kaoru@bsd> */ #include <stdio.h> int main(int argc, char const* argv[]) { char buffer[50]; int a = 3, b = 4; int n = sprintf (buffer, "%d + %d = %d", a, b, a*b); printf ("%s\n", buffer); return 0; }
コンパイル
$ c++ sprintf1.cpp
実行例
$ ./a.out 3 + 4 = 12
snprintfで書きなおした例
snprintfは、第二引数で、第一引数のバッファサイズを指定できます。そのため、バッファを超えた書き込みは行わないため、sprintf()と比較して安全です。
/* * snprintf1.cpp * Copyright (C) 2015 kaoru <kaoru@bsd> */ #include <stdio.h> int main(int argc, char const* argv[]) { char buffer[50]; int a = 3, b = 4; int n = snprintf (buffer, sizeof(buffer), "%d + %d = %d", a, b, a*b); printf ("%s\n", buffer); return 0; }
boost::format()を使用した例 boost_format.cpp
libboost-dev をインストールしてください。
/* * boost_format1.cpp * Copyright (C) 2015 kaoru <kaoru@bsd> */ #include <iostream> #include <string> #include <boost/format.hpp> int main(int argc, char const* argv[]) { int a = 3, b = 4; const std::string s = (boost::format("%1% + %2% = %3%") % a % b % (a+b) ).str(); std::cout << s << std::endl; return 0; }
そのまま標準出力に出したいなら、以下の通りです。
std::cout << boost::format("%1% + %2% = %3%") % a % b % (a+b) << std::endl;
まとめ
- どうしても、sprintf が利用したい場合は、snprintf を利用してください。
- C++ っぽく書きたいなら boost::format() を使うこともできます。
boost::format()のメモ
boost::format()で、フォーマット指定子の % が足りないと以下のエラーが出ます。気をつけてください。
terminate called after throwing an instance of 'boost::exception_detail::clone_impl< boost::exception_detail::error_info_injector<boost::io::bad_format_string> >' what(): boost::bad_format_string: format-string is ill-formed