我正在从磁盘加载文本文件到我的C应用程序。一切都运行良好,但文本包含多个转义字符,如\ r \ n和加载文本后,我想保持这些字符的数量,并相应地显示。
此时如果我在字符串上使用printf,它会显示我:
您好\ nMan \ n
任何快速的方法吗?
答案 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字符串。