「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

関連項目