2015-01-21 3 views
-2

Я загружаю текстовый файл с диска в свое приложение C. Все работает хорошо, но текст содержит несколько escape-символов, таких как \ r \ n, и после загрузки текста я хочу сохранить количество этих символов и отобразить соответственно.C загрузить текст из файла, распечатать escape-символы

На данный момент, если я использую Printf на струну, он показывает мне это:

Hello \ NMan \ п

Любой быстрый способ сделать это?

+1

Это странно. укажите ваш код, пожалуйста, – maxpovver

+1

Покажите нам соответствующие части вашего кода. (Как вы читаете и распечатываете содержимое файла) и содержимое текстового файла –

+0

Итак, файл фактически содержит экранированную версию строки, и вы хотите , например, новые строки являются настоящими новыми линиями? –

ответ

1

Там, кажется, не является стандартной функцией для этого, но вы можете свернуть свой собственный:

#include <stdlib.h> 
#include <stdio.h> 

/* 
*  Converts simple C-style escape sequences. Treats single-letter 
*  escapes (\t, \n etc.) only. Does not treat \0 and the octal and 
*  hexadecimal escapes (\033, \x, \u). 
* 
*  Overwrites the string and returns the length of the unescaped 
*  string. 
*/ 
int unescape(char *str) 
{ 
    static const char escape[256] = { 
     ['a'] = '\a',  ['b'] = '\b',  ['f'] = '\f', 
     ['n'] = '\n',  ['r'] = '\r',  ['t'] = '\t', 
     ['v'] = '\v',  ['\\'] = '\\',  ['\''] = '\'', 
     ['"'] = '\"',  ['?'] = '\?', 
    }; 

    char *p = str;  /* Pointer to original string */ 
    char *q = str;  /* Pointer to new string; q <= p */ 

    while (*p) { 
     int c = *(unsigned char*) p++; 

     if (c == '\\') { 
      c = *(unsigned char*) p++; 
      if (c == '\0') break; 
      if (escape[c]) c = escape[c]; 
     } 

     *q++ = c;  
    } 
    *q = '\0'; 

    return q - str; 
} 

int main() 
{ 
    char str[] = "\\\"Hello ->\\t\\\\Man\\\"\\n"; 

    printf("'%s'\n", str); 
    unescape(str); 
    printf("'%s'\n", str); 

    return 0; 
} 

Эта функция декодирует строку на месте. Это можно сделать безопасно, потому что неэкранированная строка не может быть длинной, чем исходная строка. (С другой стороны, это может быть не очень хорошая идея, потому что тот же буфер символов используется для экранированной и неизолированной строки, и вы должны помнить, что он держит.)

Эта функция не преобразует числовые последовательности для восьмеричной и шестнадцатеричной нотации. Есть more complete implementations, но они обычно являются частью некоторой библиотеки и полагаются на другие модули, как правило, для динамических строк.

Существует, например, functions for escaping строка.