【问题标题】:How to pad strings using preprocessor macros如何使用预处理器宏填充字符串
【发布时间】:2019-08-12 11:08:56
【问题描述】:

是否可以仅使用预处理器宏在字符串中填充空格(或任何字符)?如果有,怎么做?

例子:

#define SOME_STR               "v1.1"
#define STR_PAD(str, len)      // <-- padding defined string

#define SOME_STR_PADDED        STR_PAD(SOME_STR, 10)        // evaluates to "v1.1      "

我知道在运行时有简单的解决方案,但我的问题是如何在编译时填充字符串。

【问题讨论】:

  • 可能会改写您的问题,以便您提出真正的问题?引用您的话:...my question is if it is possible to pad... 我的回答是 - 是的,这是可能的。
  • 我问是否可能(a),如果可能,如何做(b)。英语不是我的母语,但我认为它正在传播。我将改写每个人都会理解的问题。谢谢。
  • 非常有趣的问题!在str 和len 都未知的一般情况下,以及单独str 未知的情况下,这似乎是不可能的。如果str 的长度是已知的,并且len 由某个合理的固定值限制,则可以生成编译为单个字符串常量的复合三元表达式。
  • 虽然已经这样回答了,但我想做出区分以澄清一些事情。预处理器无法确定字符串常量的长度,因此它无法执行所要求的操作。但是在编译期间还有很多事情要做;询问预处理器是否可以填充与您是否可以在编译时填充是两个不同的问题(有不同的答案)。

标签: c string c-preprocessor


【解决方案1】:

首先,预处理器可以将标记转换为字符串,但它根本无法修改现有字符串。它可以做的是将字符串文字彼此相邻放置("foo" "bar"),它在编译时被翻译 - 尽管不是由预处理器正式翻译 - 相当于连接字符串("foobar" )。

因此,您可以这样做:

#define VERSION "v1.1"
#define APPEND_10_SPACES(s) s "          "

printf("%s", APPEND_10_SPACES(VERSION));

相当难度更大,您也可以安排附加一些由宏参数指定的空格。您的网络搜索应该会出现几个与使预处理器模拟迭代有关的结果。

然而,预处理器绝对不能做的是确定或使用字符串文字的长度,以便允许您做一些相当于将文字填充到特定长度的事情。如果您需要,那么您可能会依赖以下方面的解决方法:

char padded[] = APPEND_10_SPACES(VERSION);
padded[10] = '\0';

您不会以这种方式将所需的字符串作为文字获得,但您确实得到了它,代价是分配的字节数比您需要的多 10 个字节,并且如果原始字符串实际上超过 10 个字符,则截断它.

【讨论】:

  • 感谢您的澄清。当然你是对的,在编译时除了运行预处理器之外还有更多的事情要做。实际上,我想附加与@chqrlie 的答案相对应的不同数量的空格。正如您所提到的,您可能可以编写一个包装器来模拟循环。
【解决方案2】:

非常有趣的问题!在str 和len 都未知的一般情况下,以及单独str 未知的情况下,这似乎是不可能的。如果str 的长度是已知的,并且len 由某个合理的固定值限制,则可以生成编译为单个字符串常量的复合三元表达式。

这是一个插图:

// compile time padding: str must be a string constant and len <= 4 + strlen(str)
#define STR_PAD(str, len)  (((len) + 1 <= sizeof str) ? str :        \
                            ((len) == sizeof str) ? str " " :        \
                            ((len) == sizeof str + 1) ? str "  " :   \
                            ((len) == sizeof str + 2) ? str "   " :  \
                            str "    ")

【讨论】:

  • 我想,你的意思是“len is
  • @Ctx:很好。由于sizeof(str) == strlen(str) + 1,还有一个错误
  • 这是个好主意!没想到三元表达式。
猜你喜欢
  • 2019-06-21
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2011-11-28
  • 2022-06-14
相关资源
最近更新 更多