3

私はここ数年 C# を使用しており、現在は C を記述しようとしています。値の配列から文字列をフォーマットしようとしています。「フォーマット文字列」と配列は、実行時までわかりません。

C# では、次のように、配列を使用して可変個引数関数を呼び出すことができます。

using System;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            string formatString = "{0}.{1}.{2}.{3}";
            string[] formatValues = new[] { "a", "b", "c", "d" };

            string formatted = String.Format(formatString, formatValues);

            //Do something with formatted (now looks like "a.b.c.d")
        }
    }
}

Cで私はこれを持っています:

#include <stdio.h>
#include <malloc.h>

    int main(int argc, char* argv[])
    {
        char *formatString = "%s.%s.%s.%s";
        char *formatValues[] = {"a","b","c","d"};

        char *buffer = (char*)malloc(100 * sizeof(char));

        //This doesn't work.....
        sprintf(buffer, formatString, formatValues);

        //... buffer is junk

        return 0;
    }

Cでこれを行うにはどうすればよいですか?

(C 標準ライブラリに役立つ便利な関数はありますか? あるいは、配列を使用して varargs 関数を呼び出す方法はありますか?)

引数の数が、私が持っている配列の長さを超えることは決してないことに注意してください。また、型は常に文字列になります。だから私は持っているかもしれません

char *formatString = "My Formatted String %s.%s.%s";
char *formatValues[] = {"a","b","c","d","e"};

しかし、%s が少なすぎることは決してありません。

注: C は Linux の場合は GCC、Windows の場合は Visual Studio (C90) で動作する必要があります。

4

2 に答える 2

2

Cがこれを行うための標準化された方法を提供しているとは思いません。お使いのシステムでの の内部実装を理解していれば、おそらくvprintf(3)<stdarg.h>を含むシステム固有の解決策を考え出すことは可能でしょう。

大きなサイズの配列を宣言し、値を設定してから、設定されているかどうかに関係なく、呼び出しサイトで配列のすべての要素を渡すだけで機能します。

char *a[5]; // or a[50], whatever you need

// assign the elements you actually have

printf(format_string, a[0], a[1], a[2], a[3], a[4], a[5]);
于 2013-02-10T23:00:42.847 に答える
0

sprintf が受け入れる唯一の配列の型は、null で終わる char の配列 (つまり、文字列) です。これはうまくいくはずです:

#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
    char *formatStrings[]={"%s","%s","%s","%s"};
    char *buffer= (char*)malloc(100 * sizeof(char));
    char *formatValues[]={"a","b","c","d"};
    char *endofBuffer=buffer;
    int valueCount=4;
    int i;
    for (i=0; i<valueCount; ++i)
    {
        endofBuffer+=sprintf(endofBuffer, formatStrings[i], formatValues[i]);
        if (i<valueCount-1)
            endofBuffer+=sprintf(endofBuffer, "%c", '.');
    }
    printf("%s\n",buffer);
    return 0;
}
于 2013-02-10T23:02:27.887 に答える