2010-10-09 25 views
1

我有一個C應用程序(不使用C99功能),它會執行一些重字符串處理。由於字符串長度未知,因此靜態分配的緩衝區不適用於我。我創建了一個簡單的string實現,它將抽象緩衝區的空終止和動態擴展。將格式化支持添加到自定義字符串實現 - C

這裏是如何的樣子,

struct strbuf { 
    char *buffer;   /* null terminated buffer */ 
    size_t length;   /* length of the string excluding null terminator */ 
    size_t allocated;  /* total memory allocated */ 
}; 

add功能,增加了提供的字符串到緩衝區中。

int strbuf_add(struct strbuf *string, const char *c) 
{ 
    if(string == NULL) return 0; 

    while(*c != '\0') { 
     if(!add_char(string, *c++)) 
      return 0;   
    } 

    return 1; 
} 

static int add_char(struct strbuf *string, char c) 
{ 
    size_t space_available; 

    assert(string != NULL); 

    space_available = string->allocated - string->length; 
    if(space_available <= 1) { 
     if(!grow_buffer(string)) { 
      return 0; 
     } 
    } 
    string->buffer[string->length++] = c; 
    string->buffer[string->length] = '\0'; 

    return 1; 
} 

現在,我需要添加一個新的方法類似,addformatted將採取類似的格式sprintf。我想知道什麼是最好的方法來做到這一點?以下是我的想法。

  1. 使用vsnprintf。但我不確定這是否便攜並且在所有平臺上都具有相同的行爲。
  2. 我自己寫一個格式解析器。但這似乎是更多的工作。

任何幫助實施這將是偉大的。我只對便攜式解決方案感興趣。

  • 開發信封:Linux下用GCC
  • 預計彙編MSVC
+0

至少snprintf應該是便攜式的。 – 2010-10-09 07:48:48

+2

C中的重串處理?你不能使用awk或perl嗎? – Nyan 2010-10-09 08:00:55

+0

3.編寫一個函數,將你的粘性事物插入到sprintf控制字符串中,然後將展開的控制字符串和附加參數傳遞給* printf。提示:可變參數。但是Nyan與它掛鉤:使用適合於具有真實字符串的任務的語言作爲實際類型。 – msw 2010-10-09 08:19:07

回答

1

snprintf是要走的路,並且具有明確定義的行爲,但是有一些中斷的實現在緩衝區太小時返回錯誤的值。就個人而言,我會忽略破壞的實現,除非您確實需要使用一個,或者提供整個printf系列的自定義實現來替換此類破壞的系統上的系統版本。否則,您需要研究這些系統展現的破壞行爲,並找出如何編寫解決方法。它可能需要反覆逐步擴大緩衝區,直到您的呼叫成功。

0

當您使用的sprintf,你必須有得到的字符串長度將是什麼了,要不您使用的snprintf並避免緩衝區溢出。

如果你想要這種類型的接口,你可以創建一個包裝snprintf的函數,並將一個緩衝區長度作爲參數,並在調用snprintf之前將你需要的字符串擴展爲字符串。

相關問題