ページ 11

VC2005のsprintf

Posted: 2009年3月26日(木) 09:42
by tk-xleader
VC2005で、次のプログラムを実行すると、実行時エラーが起きてしまいます。なぜでしょうか?
//C++としてコンパイルしています。
#include<cstdio>

int main()
{
	char buf[1024]={0};
	int n=0;
	std::sprintf(buf,"%x%n",4892345,&n);
	std::printf("%s,%d",buf,n);
}
エラーが起きる最小のプログラムです。エラーメッセージも一応添付しておきます。

Re:VC2005のsprintf

Posted: 2009年3月26日(木) 09:56
by Mist
私が知らないだけなのかもしれませんけど%nってなんですか?

Re:VC2005のsprintf

Posted: 2009年3月26日(木) 10:04
by Mist
VC2008のエラー画面添付します。

Re:VC2005のsprintf

Posted: 2009年3月26日(木) 10:07
by 御津凪
MSDN で調べてみると、%nは「ストリームまたはバッファにこれまでに書き込まれた文字数」
とあります。
そしてこれは、セキュリティ上の理由で限定では無効となっていて、
実行時エラー(無効なパラメータ ハンドラ)が発生します。

%nを有効にするには、 _set_printf_count_output(1); を事前に呼び出す必要があります。

Re:VC2005のsprintf

Posted: 2009年3月26日(木) 10:41
by tk-xleader
_set_printf_count_output()を呼び出してみたところ、うまくいきました。ありがとうございました。

Re:VC2005のsprintf

Posted: 2009年3月26日(木) 11:10
by たかぎ
%nを無効にしたい動機は理解できますが、既定で標準規格と異なる動作をするのは、それ自体が不具合といわれても仕方がないような...