2013-02-10 74 views
3

我一直在使用C#的最近幾年,現在我正在努力寫一些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標準庫中一個不錯的功能,我可以用它來幫助我,或者,有沒有辦法來調用一個可變參數函數數組?)

請注意,參數的數目永遠不會比我擁有的數組的長度大。類型將始終是字符串。所以我可能有

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

但我永遠不會有太少%s。

注意:C必須在GCC for Linux和Visual Studio for Windows(C90)上工作。

+2

看看vsprintf中 - http://msdn.microsoft.com/en-us/library/28d5ce15(v=vs.71).aspx – OldProgrammer 2013-02-10 22:51:58

+0

當你編譯並會發生什麼運行你給的代碼?你有任何錯誤? – 2013-02-10 22:55:33

+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

這真的很聰明。這是我的問題的一個很好的解決方案。謝謝。 – 2013-02-10 23:11:04

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; 
} 
相關問題