假设我想生成------
,只有-
,是否有一个 C 宏来生成重复的字符串?
问问题
5238 次
3 回答
14
使用提升,例如
#include <stdio.h>
#include <boost/preprocessor/repetition/repeat.hpp>
#define Fold(z, n, text) text
#define STRREP(str, n) BOOST_PP_REPEAT(n, Fold, str)
int main(){
printf("%s\n", STRREP("-", 6));
return 0;
}
于 2012-07-18T01:13:55.853 回答
6
是和不是。这并不简单,通常也不是一个好主意,但您可以为有限的、恒定的大小和恒定的字符执行此操作。使用 C 预处理器有很多方法可以做到这一点。这是一个:
#define DUP(n,c) DUP ## n ( c )
#define DUP7(c) c c c c c c c
#define DUP6(c) c c c c c c
#define DUP5(c) c c c c c
#define DUP4(c) c c c c
#define DUP3(c) c c c
#define DUP2(c) c c
#define DUP1(c) c
#include <stdio.h>
int main(int argc, char** argv)
{
printf("%s\n", DUP(5,"-"));
printf("%s\n", DUP(7,"-"));
return 0;
}
它并不漂亮,并且仅在您确实希望将字符串存储为静态(常量)数据时才有用。then
和 'c' 参数DUP
都必须是常量(它们不能是变量)。Boost.Preprocessor模块有很多关于如何以及何时(ab)像这样使用 C/C++ 预处理器的有用信息。尽管 Boost 是一个 C++ 库,但预处理器信息在很大程度上适用于纯 C。
一般来说,你最好在普通的 C 代码中这样做:
/* In C99 (or C++) you could declare this:
static inline char* dupchar(int c, int n)
in the hopes that the compiler will inline. C89 does not support inline
functions, although many compilers offered (inconsistent) extensions for
inlining. */
char* dupchar(int c, int n)
{
int i;
char* s;
s = malloc(n + 1); /* need +1 for null character to terminate string */
if (s != NULL) {
for(i=0; i < n; i++) s[i] = c;
}
return s;
}
或者,memset
按照@Jack 的建议使用。
于 2012-07-18T01:10:30.950 回答
5
不在 C 标准中。您需要编写自己的实现。
编辑:
像这样的东西:
#include <stdio.h>
#include <string.h>
#define REPEAT(buf, size, ch) memset(&buf, ch, size)
int main(void)
{
char str[10] = { 0 };
REPEAT(str, 9, '-');
printf("%s\n", str); //---------
return 0;
}
于 2012-07-18T00:56:08.470 回答