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;
}
嘿謝謝,這是一個很好的方法,我已經想過。我的問題是,只有當輸入是「\ x01」而不是輸入是「1」時,我才添加「\\ x」。有沒有可能檢查? –
@ManuelB。 'case:'\ x01''與'case:1'相同 –
好的讓我解釋得更好 - 如果輸入是「\ x01」如果輸入是「1」,我應該提供這個輸出「\\ x01」輸出應該是「1」。有沒有可能區分這兩種情況? –