5

假设我想生成------,只有-,是否有一个 C 宏来生成重复的字符串?

4

3 回答 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 回答