2015-01-05 3 views
0

Я пытаюсь избежать этого ввода \x01\xc3\xa4\xc3\xb6\xc3\xbc\xff\\x01\\xc3\\xa4\\xc3\\xb6\\xc3\\xbc\\xff, чтобы распечатать его с помощью printf("%s",input). Вообще Я, чтобы избежать всякого рода входа, а также управляющие последовательности с \ т, \ п, и т.д ...Проверьте, записано ли char в формате 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':? Должен ли я использовать регулярное выражение?

[Обновить] посмотреть на ответ от Karel. В случае, если вы задаетесь вопросом, как блок по умолчанию должен выглядеть, вот пример:

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

Эй, спасибо, это хороший подход, и я подумал об этом. Моя проблема заключается в том, что я должен добавить «\\ x», только если вход был «\ x01», а не «1». Есть ли возможность проверить это? –

+0

@ ManuelB. 'case: '\ x01'' совпадает с' case: 1' –

+0

Итак, позвольте мне объяснить лучше - если вход «\ x01», я должен предоставить этот вывод «\\ x01», если вход «1», выход должен быть «1». Есть ли возможность различать эти два случая? –

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