Как преобразовать строку ac в ее экранированную версию в c? - PullRequest
10 голосов
/ 08 июля 2010

Существует ли какая-либо встроенная функция или альтернативный простой и быстрый способ экранирования массива символов C, который при использовании с, например, printf должен снова привести к исходному массиву символов.

char* str = "\tHello World\n";
char* escaped_str = escape(str); //should contain "\tHello World\n" with char \ ,t.
printf(escaped_str); //should print out [TAB]Hello World[nextline] similar to if str was printed.

Есть ли в c простой способ экранировать строку с помощью escape-символов.

Обновление

У меня есть буфер, содержащий строку с escape-символом. И я хочу включить в C-файл. Для этого мне нужно избежать этого, чтобы оно могло быть выполнено. Мне просто нужно знать, есть ли простой способ сделать это вместо сканирования буфера для \ n \ t и т. Д. И генерирования там c escape-символа.

for(int i=0; i< strlen(buffer);i++)
    if(buffer[i]=='\n')
      sprintf(dest,"\\n")
    else ....

Обновление 2

Я написал эту функцию. Работает нормально.

char* escape(char* buffer){
    int i,j;
    int l = strlen(buffer) + 1;
    char esc_char[]= { '\a','\b','\f','\n','\r','\t','\v','\\'};
    char essc_str[]= {  'a', 'b', 'f', 'n', 'r', 't', 'v','\\'};
  char* dest  =  (char*)calloc( l*2,sizeof(char));
    char* ptr=dest;
    for(i=0;i<l;i++){
        for(j=0; j< 8 ;j++){
            if( buffer[i]==esc_char[j] ){
              *ptr++ = '\\';
              *ptr++ = essc_str[j];
                 break;
            }
        }
        if(j == 8 )
      *ptr++ = buffer[i];
    }
  *ptr='\0';
    return dest;
}

Ответы [ 5 ]

6 голосов
/ 08 июля 2010

Нет, не существует какой-либо стандартной функции для создания версии строки с исходным кодом.Но вы можете использовать функцию iscntrl для ее написания или просто использовать ключевое слово switch.

Но, если ваша программа не записывает исходный файл C, предназначенный для запуска через компилятор, вы не сможетеНужно работать с экранированными строками.printf не обрабатывает escape-последовательности символов, только вставки переменных (%d, %s и т. Д.)

В частности, следующие выходные данные дают одинаковый результат:

printf("\tHello World\n");

и

const char* str = "\tHello World\n";
printf(str);

и

const char* str = "\tHello World\n";
printf("%s", str);

Второй вариант не очень хорошая идея, потому что, если str содержит %, ваша программа выдаст неправильный вывод и может привести к сбою.

РЕДАКТИРОВАТЬ: Для создания версии исходного кода, есть несколько подходов:

Более простой, но менее читаемый вывод:

if (iscntrl(ch) || ch == '\\' || ch == '\"' || ch == '\'') {
   fprintf(outf, "\\%03o", ch);
}
else
   fputc(ch, outf);

Более читаемые результаты:

switch (ch) {
  case '\"':
    fputs("\\\"", outf);
    break;
  case '\'':
    fputs("\\\'", outf);
    break;
  case '\\':
    fputs("\\\\", outf);
    break;
  case '\a':
    fputs("\\a", outf);
    break;
  case '\b':
    fputs("\\b", outf);
    break;
  case '\n':
    fputs("\\n", outf);
    break;
  case '\t':
    fputs("\\t", outf);
    break;
  // and so on
  default:
    if (iscntrl(ch)) fprintf(outf, "\\%03o", ch);
    else fputc(ch, outf);
}
1 голос
/ 08 июля 2010

Если вам не требуется, чтобы полученная строка была удобочитаемой, а ваш набор символов во время компиляции совпадает с вашим набором символов выполнения, то самый простой способ - это использовать экранирование кодадля всего:

int print_string_literal(char *s)
{
    putchar('\"');

    while (*s)
    {
        unsigned cp = (unsigned char)*s++;
        printf("\\x%.2x", cp);
    }

    putchar('\"');
}

Вы могли бы придумать это, чтобы получить более приятные на вид строки, но вы просили кое-что просто ...

0 голосов
/ 08 июля 2010

Если вы генерируете строку для использования в качестве части исходного файла C, тогда цитирование довольно сложное (вам приходится иметь дело с символами новой строки, несколькими другими управляющими символами, кавычками, обратной косой чертой и т. Д.). Намного быстрее и проще использовать тот факт, что строка - это просто массив целочисленных значений, а не

char generated_file_str[] = "ABC\n\";

генерировать

char generated_file_str[] = {65,66,67,10,0};

Это довольно легко написать - что-то вроде:

printf("char generated_string[] = {");
for (i = 0; i < length; i++) {
    printf("%d, ", str[i]);
}
printf("0};\n");
0 голосов
/ 08 июля 2010

Пожалуйста, проверьте бумагу на printf

Вы должны знать больше о escape-последовательностях.

0 голосов
/ 08 июля 2010

Единственное, что вам нужно сделать, это заменить каждое вхождение "%" на "%%"; «%» - это символ ONLY , который printf обрабатывает специально. Экранирование "\" не имеет ничего общего с printf; они являются частью обработки строковых литералов компилятором C во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...