我需要一个像一个函数的字符串ToLiteral(字符串输入),从这个职位.这样
char *literal = to_literal("asdf\r\n");
Run Code Online (Sandbox Code Playgroud)
会产生文字==>"asdf \\ r \\n".
我已经google了一下,但找不到任何东西(猜测我必须使用错误的条款).但是,我认为具有此功能的库必须在某处...
谢谢你有趣的答案.谷歌搜索"c字符串转义函数"似乎是获得更多示例的关键,GLIB提供了g_strescape(),这似乎正是我需要的.
没有内置功能,但你可以鞭打一个:
/* Expands escape sequences within a C-string
*
* src must be a C-string with a NUL terminator
*
* dest should be long enough to store the resulting expanded
* string. A string of size 2 * strlen(src) + 1 will always be sufficient
*
* NUL characters are not expanded to \0 (otherwise how would we know when
* the input string ends?)
*/
void expand_escapes(char* dest, const char* src)
{
char c;
while (c = *(src++)) {
switch(c) {
case '\a':
*(dest++) = '\\';
*(dest++) = 'a';
break;
case '\b':
*(dest++) = '\\';
*(dest++) = 'b';
break;
case '\t':
*(dest++) = '\\';
*(dest++) = 't';
break;
case '\n':
*(dest++) = '\\';
*(dest++) = 'n';
break;
case '\v':
*(dest++) = '\\';
*(dest++) = 'v';
break;
case '\f':
*(dest++) = '\\';
*(dest++) = 'f';
break;
case '\r':
*(dest++) = '\\';
*(dest++) = 'r';
break;
case '\\':
*(dest++) = '\\';
*(dest++) = '\\';
break;
case '\"':
*(dest++) = '\\';
*(dest++) = '\"';
break;
default:
*(dest++) = c;
}
}
*dest = '\0'; /* Ensure nul terminator */
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已经省略了"转义"字符的转义序列的转换,因为这在C中没有标准化(一些编译器使用\e
和其他人使用\x
).您可以添加适用于您的任何一种.
如果您想要一个为您分配目标缓冲区的函数:
/* Returned buffer may be up to twice as large as necessary */
char* expand_escapes_alloc(const char* src)
{
char* dest = malloc(2 * strlen(src) + 1);
expand_escapes(dest, src);
return dest;
}
Run Code Online (Sandbox Code Playgroud)