c/c++语言开发共享将ac字符串中的字符转换为其转义序列

我需要一个像这篇文章中的 字符串ToLiteral(字符串输入) 这样的函数。 这样

char *literal = to_literal("asdfrn"); 

会产生文字==>“asdf \ r \ n”

我已经google了一下,但却找不到任何东西(猜测我一定是在使用错误的术语)。 但是,我认为具有此function的库必须在某处…

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

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

     /* 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  (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 = ''; /* Ensure nul terminator */ } 

    请注意,我已经省略了“转义”字符的转义序列的转换,因为这在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; } 

    我想我会做这样的转换:

     // warning: untested code. void make_literal(char const *input, char *output) { // the following two arrays must be maintained in matching order: static char inputs[] = "abfnrtv\"'"; static char outputs[] = "abfnrtv\"'"; char *p, *pos; for (;*input;input++) { if (NULL!= (pos=strchr(inputs, *input))) { *output++ = '\'; *output++ = outputs[pos-inputs]; } else *output++ = *input; } *output = ''; } 

    从理论上讲,这可能比Tyler McHenry的代码慢一点(例如)。 特别是,他使用switch语句允许(但不要求)正确路径的恒定时间选择。 实际上,考虑到所涉及的值的稀疏性,您可能无法获得恒定的时间选择,并且所涉及的字符串非常短,以至于差异通常在任何情况下都非常小。 在另一个方向,我希望这更容易维护(例如,如果你想支持更多的转义序列,只要表格保持不变,添加它们应该非常简单)。

    我认为你混淆了术语,你可以像这样初始化一个指向char(acter)的指针:

     char *literal = "asdfrn" 

    修订:但是,C字符串能够使用转义引号,例如:

     char *literal = "basdfx1brnvt"; 

    那将打印出来

     asdf 

    根据控制台function不会显示这些字符,你可能会看到转义的箭头和标签的间距…你可以通过使用一个简单的逻辑解决这个问题,对于遇到的每个 ,插入另一个它会显示出来

     asdf\r\n 

    类似下面的代码就足够了:

     void ToLiteral(const char *pStr){ char *p = (char*)pStr; while (*p){ /* if (*p == '\') putchar('\'); */ /* PERFORM THE LOOK UP */ putchar(*p++); } } 

    但是看着它,它感觉不对,因为指针持有实际的nr n因此可能更容易使用查找表来比较转义序列的实际hex代码并显示相应的代码…查找表可能是这样的

     struct LookUp{ int codeLiteral; char *equivCodeLiteral; }; struct LookUp look[] = { { 0xa, "\r"}, { 0xd, "\n" }, { 0x9, "\t" } }; 

      以上就是c/c++开发分享将ac字符串中的字符转换为其转义序列相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562224.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐