arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
sprintf()
sprintf()

この関数の目的

sprintf()は、文字列にフォーマットされた文字列を書き出す。

定義

	#include <stdio.h>
	int sprintf(char *s, const char *format, ...);

働き

この関数はストリームに出力するかわりに、文字列に対して出力に相当するものを書き出す fprintf() と等価である。 ヌル文字が文字列の末端に付け加えられるが、これは返り値の文字数のうちには入らない。重複する記憶域で複写が行われることになったら、動作は未定義である。

返り値は、末端のヌル文字を含まない、出力した文字数である。エラーが発生した場合、負の数を返す。

解説

format の書き方は fprintf() を参照のこと。

この関数は printf() などのようなストリームに対して出力する方法と代わって、文字列に対して書き出すことのできるものである。

特に注意しなければならないのは、この関数は文字列に書き出す文字数に上限を設けていないということである。 つまり、余計に多く文字列を確保しておかないと、配列オーバーの危険性があるということである。 知ってのとおり、配列オーバーはトップクラスにデバッグが難しいバグであり、再現性も低い。

この関数は可変長引数関数 (Variable argument) と呼ばれる特殊な関数である。 この種の関数は宣言の引数リストの最後に「...」がついているもので、ここから後はどんな型のいくつの変数であろうと渡すことができる。 しかし、渡される側はどんな型のいくつの変数が渡されたかを直接知る手段はない。 関数は format に渡される文字列を元に、これらの引数の数と型を知る。 よって、 format の文字列と実引数リストが食い違っていてはいけない

可変長引数関数については、 <stdarg.h> を参照されたい。

arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC