2015-01-05 12 views
0

我試圖逃避此輸入\x01\xc3\xa4\xc3\xb6\xc3\xbc\xff到此\\x01\\xc3\\xa4\\xc3\\xb6\\xc3\\xbc\\xff以打印出printf("%s",input)。一般來說,我已經逃避各種輸入,並且還使用\ T,\ n等序列......檢查字符是否寫在 xHH表示法

要做到這一點,我已經寫了下面的功能:

void kvstr_escape_string(char* dest, const KV_Buffer* src) 
{ 
char c; 
int i = 0; 
const char* data = src->data; // src->data is a char* 

while (src != NULL && i < src->length && (c = *(data++))) { 
    switch(c) { 
     case '\a': 
       *(dest++) = '\\'; 
       *(dest++) = 'a'; 
       break; 
     case '\b': 
       *(dest++) = '\\'; 
       *(dest++) = 'b'; 
       break; 
     case '\t': 
       *(dest++) = '\\'; 
       *(dest++) = 't'; 
       break; 
     case '\n': 
       *(dest++) = '\\'; 
       *(dest++) = 'n'; 
       break; 
     case '\v': 
       *(dest++) = '\\'; 
       *(dest++) = 'v'; 
       break; 
     case '\f': 
       *(dest++) = '\\'; 
       *(dest++) = 'f'; 
       break; 
     case '\r': 
       *(dest++) = '\\'; 
       *(dest++) = 'r'; 
       break; 
     case '\\': 
       *(dest++) = '\\'; 
       break; 
     case '\"': 
       *(dest++) = '\\'; 
       *(dest++) = '\"'; 
       break; 
     case '\x01': 
       *(dest++) = '\\'; 
       *(dest++) = 'x'; 
       *(dest++) = '0'; 
       *(dest++) = '1'; 
       break; 
     // Here i need something to handle \xHH 
     default: 
       *(dest++) = c; 
     } 
     i++; 
    } 

    *(dest++) = '\0'; 
} 

我的問題我如何處理所有不同的\ xHH輸入,如case '\x01':中的函數所示?我應該使用正則表達式嗎?

[更新]查看卡雷爾的答案。如果你想知道的缺省塊應該看起來怎麼樣,這裏有一個例子:

default: 
     if (c < 32 || c > 126){ 
      *(dest++) = '\\'; 
      *(dest++) = 'x'; 
      sprintf(d, "%.2x", c); 
      *(dest++) = d[0]; 
      *(dest++) = d[1]; 
     }else{ 
      *(dest++) = c; 
     } 

回答

1

您的代碼

case '\x01': 
    *(dest++) = '\\'; 
    *(dest++) = 'x'; 
    *(dest++) = '0'; 
    *(dest++) = '1'; 
    break; 

基本上只是意味着以數值1字面字節匹配,你可以只以及它編寫爲

case 1: 
    ... 

我將這個塊移動到default情況並匹配c是否是31或更小(32作爲一個空間)。此外,您可能希望轉義ASCII值大於126的字符,即代字號。關閉我的頭頂:

default: 
    if (c < 32 || c > 126) 
     // add "\\x" followed by two hex digits of the value of c 
    else 
     // simply add the value of c 

至於值的兩個十六進制字符轉換,我會使用一個小轉換緩衝和sprintf()。希望這可以幫助!

+0

嘿謝謝,這是一個很好的方法,我已經想過。我的問題是,只有當輸入是「\ x01」而不是輸入是「1」時,我才添加「\\ x」。有沒有可能檢查? –

+0

@ManuelB。 'case:'\ x01''與'case:1'相同 –

+0

好的讓我解釋得更好 - 如果輸入是「\ x01」如果輸入是「1」,我應該提供這個輸出「\\ x01」輸出應該是「1」。有沒有可能區分這兩種情況? –