2013-02-10 1 views
3

Я использую C# в течение последних нескольких лет, и сейчас я пытаюсь написать C. Я пытаюсь отформатировать строку из массива значений. «Строка формата» и массив неизвестны до времени выполнения.Как форматировать строку из массива значений в C?

В C# я могу вызвать функцию VARIADIC с массивом, например:

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, я могу использовать, чтобы помочь мне, или, может быть, есть способ вызова функции с переменным числом аргументов с массивом?)

Обратите внимание, что количество аргументов никогда не будет больше длины массива, который у меня есть. И типы всегда будут строками. Поэтому у меня могло бы быть

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

Но у меня никогда не будет слишком мало% s.

Примечание: C должен работать на GCC для Linux и Visual Studio для Windows (C90).

+2

Посмотрите на vsprintf - http://msdn.microsoft.com/en-us/library/28d5ce15(v=vs.71).aspx – OldProgrammer

+0

Что происходит при компиляции и запустить код, который вы дали? Вы получаете какие-либо ошибки? –

+0

Я не думаю, что вы хотите в один шаг. Возможно, вы захотите запустить цикл и 'sprintf()', а затем 'strcat()'. Кроме того, используйте 'snprintf()' вместо 'sprintf()' - это несколько уменьшает вероятность ошибок переполнения буфера. – 2013-02-10 22:55:58

ответ

2

Я не думаю, что C предоставляет стандартизованный способ сделать это. Если вы поняли внутреннюю реализацию <stdarg.h> в вашей системе, вероятно, было бы возможно клудж до системного конкретного решения с участием vprintf (3), но у меня есть другой, корректный кладж для вас ...

Что-то, что работает, потребует объявления массива большого размера, установки значений, которые у вас есть, а затем просто передать каждый элемент массива на сайте вызова независимо от того, установлены ли они.

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]); 
+0

Это действительно умно. Это отличное решение моей проблемы. Благодарю. –

0

Единственный тип массива Sprintf принимает является нулевым байтом массив символов (то есть строку). Это должно работать:

#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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^