1

私は本質的にの実装を書いていprintfます。文字列内で多くの文字列を渡すことができるようにしたいです。

kprintf("Hello %s", "Goodbye %s", "Farewell\n");

理由を聞かないでください。非常識かもしれません。とにかく、渡される文字列に含まれる % 文字の数を探した後、再帰的に自分自身を呼び出します。そのため、複数の % が含まれている場合は、多くの引数を渡す必要があります。ただし、これを優雅に実現することはできませんでした。以下を参照してください。

case 1:
    kprintf(str, argus[0]);
break;
case 2:
    kprintf(str, argus[0], argus[1]);
break;
case 3:
    kprintf(str, argus[0], argus[1], argus[2]);
break;
case 4:
    kprintf(str, argus[0], argus[1], argus[2], argus[3]);
break;
case 5:
    kprintf(str, argus[0], argus[1], argus[2], argus[3], argus[4]);
break;

argusポインターの配列として。これはうまくいきますが、私はそれが嫌いです。可変引数を関数に渡す方法はありますか?

4

3 に答える 3

3

あなたの仕事をするタイプがあります。これは「va_list」と呼ばれ、引数を与えることができます (最大で 4096 だと思います)。これを使用するには、starg.h-header を含め...ます。関数宣言で省略記号を使用する必要があります。

int kprintf(int count, ...){
va_list vl;
va_start(vl,count);
for (i=0;i<n;i++)
{
val=va_arg(vl,double);
printf (" [%.2f]",val);
}
va_end(vl);
}

例については、こちらを参照してください。

于 2013-02-20T11:18:14.740 に答える
0

%<something>に渡された文字列内で解析するものを書くことは可能ですが%s、それは一般的にC /C++で行われる方法ではありません。

printfフォーマットされた文字列をステートメントに入れたい場合はsprintf()、(一時バッファ内の)最初の文字列をフォーマットしてから、その文字列を実際のprintf関数に渡します。はい、これには余分な手順が必要ですが、コードがはるかに簡単になります。渡された文字列を解析する場合は、再帰的printfにする必要があります[または、printf内にprintfある種の操作を実行する必要があります]。stack

于 2013-02-20T11:41:23.043 に答える
0

C++ を使用できる場合は、可変引数関数に関する記事とダウンロード可能なソース コードをここで見つけることができます。これで問題が解決するはずです。

于 2013-02-20T11:17:14.127 に答える