我需要一个像这篇文章中的 字符串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++); } }
但是看着它,它感觉不对,因为指针持有实际的n
和r
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