• ベストアンサー

sprintf関数の作り方

c言語にsprintf関数っていうのがありますが、 これはどうやって作るのでしょうか? sprintf関数は引数の数が可変であり、引数のデータ型 が様々なので、いったいどうやって作るのか知りたいです。 どこかにソースでもあればいいのですが・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.4

#2です。 回答したもののそれほど詳しくはないのですが…。 (1) 引数の個数はどうやって知るのか? 知ることはできません。 従って受け取り側で決め打ちしてやることになりますね。 printfを例に取れば、例えば "%d%d%d" とあれば3つ引数がある“はず”として処理する。 実際にprintfで "%d%d%d" に対して1つしか引数を与えなくてもエラーにはなりません。その代わり無理やり処理して変な値が出ますよね。 (2) 引数の型はどうやって知るのか? これまた知ることはできません。 従ってこれまた受け取り側で決め打ちにすることになります。 ただprintfの場合ですと書式内に型が明示されているので、%dだからint型で受け取ろうとか、%sならchar*型で受け取ろうと処理できます。

ttr133
質問者

お礼

なるほど! 今作ろうとしている関数は自作のsprintf関数 なんです。 sprintf(str, "a = %d, b = %d\n", data1, data2); などとしたいのですね。ご指摘のとおり書式文字列 の中を調べて引数の数を推測することができますね。 なるほど。 すっきりしました。ありがとう。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> どこかにソースでもあればいいのですが・・・。 簡単なので、ここに書きます。 #include <stdio.h> #include <stdarg.h> int sprintf(char *s, const char *format, ...) {  va_list ap;  int result;  va_start(ap, format);  result = vsprintf(s, format, ap);  va_end(ap);  return result; }

  • ttyp03
  • ベストアンサー率28% (277/960)
回答No.2

可変引数のプロトタイプは次のような感じで宣言します。 void func(int num, ...) また可変引数は、va_start(),va_arg(),va_end()という関数で処理できます。 詳しくはこちらのページを参照。 http://www.geocities.jp/ky_webid/c/057.html

ttr133
質問者

補足

すばやいアドバイスありがとう。 少し質問させてください。 (1) 引数の個数はどうやって知るのか? (2) 引数の型はどうやって知るのか? とても気になります。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1
参考URL:
http://homepage2.nifty.com/t-1000/c/va_list.html

関連するQ&A

  • C言語のsprintfに相当する関数をご存知でしたら教えて下さい。

    初めてjavaでプログラムを作成しています。 C言語のsprintfに相当するような書式文字列が扱える関数をご存知でしたら教えて下さい。 宜しくお願いします。

  • sprintfのような関数を自作する

    表題のようにsprintfのような関数を自作することはできますか? 行いたいのは、例えば、 void TestKansu(AnsiString str) { //str文字列を処理 } という関数を用意したとしてこれを使うには AnsiString str; str.sprintf("TestMessage %d" , tes); TestKansu(str); としなくてはいけないと思いますが、もっと簡潔に TestKansu("TestMessage %d" , tes); とできるような関数を自作することは可能ですか? C++です。 宜しくお願いいたします。

  • sprintf の使い方について

    C 言語の超初心者につき,おろかな質問をお許しください。 sprintf 関数について char str[40]; sprintf(str, "hogehoge %d", hoge_int); という文法はよく目にするのですが char *str; sprintf(str, "hogehoge %d", hoge_int); という文法はあまり見たことがありません。 両方ともちゃんと動くのですが,後者は文法的に正しいのでしょうか? char str[40] とした場合でも char *str とした場合でも, str は文字列の最初の文字のアドレスを表すんだったと思うんですが。 違いが分からず,混乱しています。 初心者につき,間抜けな質問をしているかもしれませんが,ご教授くださると幸いです。

  • sprintf関数について教えて下さい。

    sprintf関数について教えて下さい。 #include <stdio.h> int main(void) { int i; char ns[20][6]; for (i = 0; i < 20; i++) sprintf(ns[i], "No.%02d", i + 1); for (i = 0; i < 2; i++) printf("%s\n", ns[i]); return 0; } 上のプログラムでは結果が No.01 No.02 (中略) No.19 No.20 ですが、sprintf関数内の書式指定を"No.%02d\n"に変更した場合、 結果が No.01 No.02 (中略) No.19 No.20 No.02 No.03 (中略) No.19 No.20 No.03 No.04 (中略) No.19 No.20 (中略) No.19 No.20 No.20 になります。 どうしてこのようなことが起きてしまうのか自分では説明できません。 sprintf関数の説明も読んで納得はしたのですが 上のようになることがわかりません。 長々と書いてしまいましたが よろしくお願い致します。

  • C言語のsprintfに相当するJAVAのメソッドは何か

    C言語ではデータを編集してメモリに出力する関数sprintfがある。 char rec[100] ; int i=1, j =2, k =3 ; sprintf(rec, "%3d %3d %3d", i, j, k ) と書くと、変数i,j,kの値が編集されてrecに入る。 このsprintfに相当するJAVAのメソッドはあるか。

    • ベストアンサー
    • Java
  • sprintf関数での文字列変換について

    マイコンにて、 C言語で浮動小数点の数値を表示するプログラムを作成しているのですが、 PRINT_OUT("123.456"); のように、文字列を直接指定した場合は正しく表示されるのですが、 sprintf()関数を用いて、浮動小数点を文字列に変換した場合、 buf char[10]; sprintf(buf,"%lf",123.456); PRINT_OUT(buf); とした場合はプログラムが暴走?(恐らく配列破壊を起こしていると 思われますが、)してしまい、上手く動作しません。 (但し、整数の場合は正常に動作します。) そこで、質問させていただきたいのですが、 "123.456"のように直接文字列を指定した場合と、浮動小数点123.456 をsprintf()関数を用いて文字列に変換した"123.456"の書式に何か 違いはあるのでしょうか?よろしくお願い致します。

  • 引数の数が可変な関数

    C言語の関数でいつも不思議に思うのですが printf("%sさんの成績は、%d点です。", name, score); printf("\n\n"); のように引数が可変な関数を作成したいのですが、どうすればよいでしょうか? CとC++の両方の書き方が知りたいです。 理解したいの解説している書籍なども探しています。

  • Javaでsprintfのようなもの

    JavaでC言語のsprintfのようなフォーマット書式機能のついた文字列生成メソッドはあるのでしょうか? 自作しないと存在しないのでしょうか?

    • ベストアンサー
    • Java
  • C言語の高階関数についてです。

    C言語の高階関数についてです。 double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、 「関数を引数にする関数」を引数にする関数って作れますか??? その場合は、引数のところどうやって書けばいいでしょうか??

  • sprintfに同じ変数は使えるか

    int sprintf( char *buffer, const char *format [, argument] ... ); 第1引数と第3引数以降に同じ変数を使えますか? memcpy()のように、同じ変数を使えない場合があるのか知りたいです。

専門家に質問してみよう