【问题标题】:How to escape characters in a string and also show the escaped characters?如何转义字符串中的字符并显示转义字符?
【发布时间】:2014-08-12 10:48:53
【问题描述】:

如何在 C 中将 \ 放在字符串的 " 之前而不逐个字符地解析字符串?

实际上,我们正在使用sprintf 来获取字符串,并且我们正在形成 JSON 响应。但是 JSON 给了我们错误,因为它期望 \" 之前出现。

例如,如果字符串格式为:

"hi "hello" bye"

我应该得到它的格式

"hi \"hello\" bye"

【问题讨论】:

  • 首先,我确定这是一个错字,但对我来说,反斜杠是\,您可能需要编辑您的问题以反映这一点。第二,你不能逃掉sprintf中的"。可以给我们看看相关代码吗?
  • code : json_resp->offset += sprintf(&json_resp->buffer[json_resp->offset], "\n\""JSON_FIELD_EVENT_SYNOPSIS"\": \"%s\",", utf8_str );这里 utf8_str 是在字符串之间包含双引号的字符串。所以我想在 " 之前添加反斜杠以提供正确的 JSON 格式,而不是逐个检查字符串中的字符
  • “不逐字符解析字符串”是什么意思?自己不这样做(所以你要求一个有这样做的函数的库)或者根本不这样做?如果您不知道需要转义的字符在哪里,则后者是不可能的。另请注意,JSON 需要用"\\n" 而不是"\\\n" 等替换换行符。这些字符串是如何生成的?也许你可以在创建时处理这些角色。

标签: c escaping


【解决方案1】:

只需在 sprintf 中通过在 \" 之前添加 \\ 来转义反斜杠即可:

json_resp->offset += sprintf(&json_resp->buffer[json_resp->offset], 
               "\n\\\""JSON_FIELD_EVENT_SYNOPSIS"\\\": \\\"%s\\\",", utf8_str);

您应该考虑使用snprintf 以避免缓冲区溢出。

【讨论】:

  • JSON_FIELD_EVENT_SYNOPSIS 是一个宏,我们已经使用反斜杠在引号中显示它,因此不会遇到问题。问题在于 utf8_str 之间包含双引号。例如,如果 utf8_str 包含字符串 [ The rich "earn" decade at] 上面的代码给出:"synopsis":"The rich "earn" countries at"。这是给出的浏览器的输入,它抛出错误,因为在双引号之间没有 \
【解决方案2】:

一块一块地看,而不是一气呵成。

您想查看需要转义的\\\

接下来要查看",也需要转义:\"

总之就是:

printf("hi \\\"hello\\\" bye")

如果你按照上面的方法分解它,它看起来比实际更糟糕,更令人困惑 - 它没有特殊的规则,它只是将 (ahem..) 字符串在一起,你已经知道如何逃跑。

【讨论】:

  • 在上面的代码中,用户明确注意将 \ 放在 " 之前。在作为 sprintf 输入的批量字符串中,其中包含双引号并且不知道引号的位置。在这种情况下如何如上所述处理它,第一个给出的解决方案对我没有帮助:(。
  • 简单解释:在我们之前的代码中,我们习惯于逐个字符地检查输入字符串,如果发现特殊字符,我们会在“之前放置 // 并形成最终的输出字符串。现在我们想要避免它,因为逐个字符检查需要更多时间。所以我正在寻找替代解决方案。
猜你喜欢
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 2016-04-15
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多