C从文件加载文本,打印转义字符

时间:2015-01-21 07:11:05

标签: c

我正在从磁盘加载文本文件到我的C应用程序。一切都运行良好,但文本包含多个转义字符,如\ r \ n和加载文本后,我想保持这些字符的数量,并相应地显示。

此时如果我在字符串上使用printf,它会显示我:

您好\ nMan \ n

任何快速的方法吗?

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

此函数将字符串取消到位。这样做是安全的,因为未转义的字符串不能长于原始字符串。 (另一方面,这可能不是一个好主意,因为相同的char缓冲区用于转义和未转义的字符串,你必须记住它所持有的。)

此函数不会转换八进制和十六进制表示法的数字序列。周围有more complete implementations,但它们通常是某些库的一部分,依赖于其他模块,通常用于动态字符串。

当然,有一个类似的functions for escaping字符串。