【问题标题】:What's the alternate character combination for the double quote character in C/C++?C/C++ 中双引号字符的替代字符组合是什么?
【发布时间】:2010-02-05 18:01:26
【问题描述】:

我已经好几年没有参考 Kernighan 和 Ritchie C 了,但我记得那里有一个页面讨论了如何输入您无法使用的字符。 (在过去,有些键盘缺少“、~ 等字符”)

为了清楚起见,让我举个例子。我不是在寻找一种在字符串中获取引号的方法,而是我想替换它:

printf("foo");

用这个:

printf([alternate sequence]foo[alternate sequence]);

出于好奇,我有一个涉及生成 C/C++ 代码的自动化过程,但是(封闭源代码)商业工具涉及在其数据流中去除引号,并且文档非常清楚它们不提供逃避他们的方法。

编辑:

哇,我没想到会有这么大的反应。这可能值得对我的过程进行更多详细说明。我正在做自动构建系统,这意味着在更改我正在编译的代码时我会受到某些限制。现在,我们必须接受这样的假设,即我必须将字符串、空格和所有内容放入预处理器定义中。我已经去了'PreprocessorDefinition' road。这给我留下了我通常的后备:在操作环境中定义字符串并让项目文件从那里设置定义:

Preprocessor Definitions     WIN32;_DEBUG;THINGIE=$(THINGIE)

希望通过在我的构建自动化脚本中执行类似的操作,我可以绕过 MSVC 在使用三元组使用 /D 传递给构建的任何内容中去除引号:

ENV['THINGIE'] = "??''Yodeling Monkey Nuggets??''"
run_msbuild_command

我想是时候制定 C 计划了。

【问题讨论】:

  • 能否进一步处理程序的输出?如果你能做到这一点,你可以为" 声明一些罕见的字符序列,并将该程序的输出通过管道传递给sed,这会返回你的双引号。
  • 是时候考虑生成一个包含引号的标题,然后在需要预处理器定义的地方包含该标题。

标签: c++ c character sequences alternate


【解决方案1】:

您正在为" 字符寻找trigraph?我不认为存在。

并非所有字符都存在三元组。只有少数字符有三字序列。

【讨论】:

  • 根据 2.3 Trigraph 序列和 2.5 Alternative 标记,绝对不存在双引号的替代品。
  • Trigraph 是我所追求的词。大约十年没听过这首歌了。谢谢。
【解决方案2】:

根据标准没有。尝试包含带有宏的标题:

 #define QUOTE(x) #x

并生成printf 为:

 printf(QUOTE(hello));

【讨论】:

  • 如果去掉引号会有什么帮助?
  • 你的意思是#define QUOTE(x) #x? AFAIK,您当前的宏为所有输入输出 "x" 字符串。
  • @在生成 C++ 文件时将标题分开并添加#include。预处理器应该负责引用。
  • 现在他只需要确保并设置好一切,这样他就可以在不使用引号的情况下#include。 :) 在这种情况下,最好在命令行上定义 QUOTE 宏。
  • 我赞成这个答案(我是原始海报),因为我已经考虑过这条路。它的缺点是,如果参数本身是预处理器定义,则打印参数的名称,而不是值。
【解决方案3】:

你正在考虑三合符

 Character   Trigraph
 [           ??(
 \           ??/
 ]           ??)
 ^           ??'
 {           ??<
 |           ??!
 }           ??>
 ~           ??-
 #           ??=

但是 " 不在列表中

【讨论】:

    【解决方案4】:

    我想你说的是trigraphs。据我所知," 字符没有一个。

    【讨论】:

      【解决方案5】:
      但是(封闭源代码)商业工具涉及在其数据流中去除引号,并且文档非常清楚地表明它们没有提供逃避它们的方法。

      听起来像个糟糕的工具。

      它看起来很丑,但你可以试试这样:

      static const char foo[] = {'H', 'e', 'l', 'l', 'o', 0};
      
      printf(foo);
      

      我也喜欢 dirkgently 的建议,即在宏中使用 #,但我想知道空格如何处理?

      【讨论】:

      • @mark4o - 当然。我最初有static const char foo[](因为我已经看到一些编译器生成的代码实际上会在没有static的情况下将一个大数组复制到堆栈中,即使const也是如此)但我认为这会分散注意力实际的想法——而且它可能会引起挑剔的 cmets,所以我把它省略了。
      • @asveikau:即使是 const,非静态时也需要唯一的地址,并且由于 C 风格的字符串经常作为指针传递,因此复制比进行全面分析要容易得多以确保重复值无关紧要。
      • @Roger Pate:这里没有参数。我之所以写这个是因为我曾经在一个函数中声明了一个大型查找表,然后看到该函数的反汇编有点吃惊/好笑。从那以后,我试着记住让这些东西静态化。 :-) 但正如所提到的,这与问题非常相切。
      • 如果它是一个局部变量,那么static 可以帮助避免每次调用函数时将数据复制到堆栈中。如果它的行为类似于字符串文字,那么const 很好,因为数据将像真正的字符串文字一样位于只读内存中,这可以防止意外覆盖,减少分页时必须写入磁盘的数据量或转储核心,并在有多个程序实例运行时增加进程之间可以共享的数据量。
      【解决方案6】:

      你觉得用´ 代替' 怎么样?

      我遇到了同样的问题,并试图通过用无害的东西替换文本分隔符来避免它。

      【讨论】:

        猜你喜欢
        • 2012-03-12
        • 2017-08-21
        • 2023-04-07
        • 2021-04-26
        • 2011-07-08
        • 2016-04-10
        • 1970-01-01
        • 2014-08-30
        • 2013-07-02
        相关资源
        最近更新 更多