将ac字符串中的字符转换为其转义序列

Chr*_*sen 5 c escaping

我需要一个像一个函数的字符串ToLiteral(字符串输入),从这个职位.这样

char *literal = to_literal("asdf\r\n");
Run Code Online (Sandbox Code Playgroud)

会产生文字==>"asdf \\ r \\n".

我已经google了一下,但找不到任何东西(猜测我必须使用错误的条款).但是,我认为具有此功能的库必须在某处...

谢谢你有趣的答案.谷歌搜索"c字符串转义函数"似乎是获得更多示例的关键,GLIB提供了g_strescape(),这似乎正是我需要的.

Tyl*_*nry 8

没有内置功能,但你可以鞭打一个:

/* 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)

  • 这是编写它的另一种方法,但几乎所有C标准库字符串函数都是以这种方式编写的. (2认同)
  • `expand_escapes()`将任何其他非打印字符编码为八进制转义符可能是友好的.它将常用的ASCII ESC字符处理为`\ 033`.当然,您的输出缓冲区可能是输入大小的4倍,因此在返回之前分配那么多realloc可能是有意义的.您还可以使用长度参数处理嵌入的NUL字符,其中负长度意味着在第一个NUL处停止. (2认同)