2015-01-21 65 views
-2

我正在從磁盤加載文本文件到我的C應用程序。一切正常,但文本包含多個轉義字符,如\ r \ n和加載文本後,我想保留這些字符的計數,並相應地顯示。C從文件加載文本,打印轉義字符

這時如果我使用的字符串的printf,它表明我:

你好\ nMan \ n

這樣做的有快捷方式?

+1

這很奇怪。請提供您的代碼 – maxpovver 2015-01-21 07:14:39

+1

向我們展示您的代碼的相關部分(您如何閱讀和打印文件的內容)以及文本文件的內容 – 2015-01-21 07:20:26

+0

因此,該文件實際上包含字符串的轉義版本,並且您希望例如,換行符是真正的新行? – 2015-01-21 07:30:40

回答

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; 
} 

此功能取消轉義到位的字符串。這是安全的,因爲非轉義字符串不能比原始字符串長。 (另一方面,這可能不是一個好主意,因爲相同的char緩衝區用於轉義字符串和非轉義字符串,並且您必須記住它保存的是哪一個。)

此函數不會將數字序列爲八進制和十六進制符號。有more complete implementations左右,但它們通常是某些庫的一部分,並依賴於其他模塊,通常用於動態字符串。

也有類似的functions for escaping一個字符串,當然。