【问题标题】:How do I convert C/C++ string with escape character to a plain (raw) string如何将带有转义字符的 C/C++ 字符串转换为纯(原始)字符串
【发布时间】:2010-01-03 22:35:52
【问题描述】:

函数原型是:

string f (string s);

char* f (char* s);

f 会将可打印的 ascii 字符表示的字符串转换为原始字符串。

它的行为如下例所示:

f("AAA") = "AAA"
f("AA\n") = "AA+line_feed"

即输入字符串为 4 字符长(+ NULL),输出为 3 字符长(+NULL)。 2 个可打印字符 '\' 'n'(输入字符串的最后 2 个字符)被一个 LF 字符(ascii 10)替换

f("\0x007") 返回一个长度为 1 的字符串,其中包含 char ascii 7

f("AA\nAA\tAA\07\n") 会将所有这些转义字符转换为它们的真实(每个转义序列 1 个字符)等价物。

这必须存在,至少 C 编译器/C 预处理器会这样做。

/C

【问题讨论】:

  • 这是作业吗?到目前为止,您尝试过什么?
  • 来吧:在你问问题之前尝试一下。这只是纯粹的懒惰。
  • NULL 是空指针常量。 "AAA" 不是“4 char long + NULL”,它是 C 中的“字符串”(以零结尾的字符序列)。 0 也是 ASCII NUL,但在这种情况下您对 NULL 的使用是错误的。

标签: c++ c escaping character


【解决方案1】:

我认为您完全误解了转义序列的工作原理。例如,如您所建议的,“AA\n” not4 char long (+ NULL)” 实际上正是您想要的 - 三个字符串。编译器为您提供翻译,它不会在运行时发生。

要确定这是真的,请尝试以下操作:

printf( "%d\n", strlen( "AA\n" ) ) ;

你会发现输出是 3。

现在,如果您在运行时有一个包含转义序列的字符串;例如文字字符串“AA\n”,其中 四个字符,那么标准库没有理由仅仅因为编译器执行您似乎认为的翻译而提供此功能。编译器功能在运行时不可用。

自己实现这样的翻译是微不足道的,例如,您可以简单地在遇到“\”时扫描字符串,您可以使用下一个字符作为开关构造的控制变量来选择将哪个字符插入到输出字符串中。如果遇到 \x 或 \0,则需要读取后续的十六进制或八进制数字以确定要插入的字符。

【讨论】:

  • 感谢您的回复...但我们同意:我知道当您在 C 文件中键入“AA\n”时,CPP 会将其转换为 3 字符长的字符串。但是我的问题是我正在编写的程序从文件中读取这些字符串,就像 CPP 一样。因此,当我阅读“AAA\n”(5 个字符)时,我想要一个将 \n 转换为 ascii 10(或任何其他转义字符)的函数......我想做 CPP 所做的事情!
  • 你应该改变问题的标题和内容。您的输入字符串看起来像"AA\\n",并且您希望将其转换为"AA\n"。当然,这仍然感觉像是作业,所以请向我们展示您到目前为止所做的工作。
  • @Christophe:我的回答在最后两段中解决了这个问题。我们可能同意,但你的问题含糊不清,所以我回答了两种解释。
【解决方案2】:

嗯,不。没有 C 标准库或 STL 的入口点可以做到这一点。是的,cpp 的实现中有代码。找到它所需的时间是自己编写代码的 20 倍。

【讨论】:

    【解决方案3】:

    这称为“取消引用”或“取消转义”。 C 编译器通常会在扫描输入文本时执行此操作,因此您不太可能在任何 C 编译器源代码中找到这样的函数。最好的办法是编写一个简单的函数来扫描字符串,替换转义符,将字符存储在输出字符串中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多