有没有一个 C 宏可以生成重复的字符串?

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

1
是的:https://dev59.com/F3RC5IYBdhLWcg3wXP0C#10542793 并且请记住,放在一起的字符字面量会自动连接。 - Seth Carnegie
1
在我的键盘上,你只需要按住键就可以了,不需要宏。 - Bo Persson
3个回答

14

使用Boost,例如:

#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;
}

4
包括提升它吗?个人而言,我更喜欢做一个简单的循环。 - The Mask
3
@TheMask: 同意。为什么要为此增加编译时间(很多)?Boost过于复杂。 - sfstewman
1
也许有些过度,但另一方面,为什么人们不应该使用专门设计用于解决此类问题的工具呢?BOOST是一个很棒的库——像这样的好例子会让更多的人对它产生兴趣。 - Piotr Tkaczyk
@TheMask - 我认为有一个字面量,因为我只是想最终。 - BLUEPIXY
@sfstewman - 编译时没有太多时间,但会略微增加。 然而,收到的好处更大。此外,无需进行现有的制作。 - BLUEPIXY
那是一个很棒的答案。当然,使用纯C也有可能做到同样的事情,而不需要boost库。 - Jean-François Fabre

7
是和不是。这并不简单,通常也不是一个好主意,但你可以在有限的、恒定的大小和恒定的字符情况下实现它。有许多方法可以使用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;
}

这不是很美观,只有在你真正希望字符串被存储为静态(常量)数据时才有用。DUP的n和'c'参数都必须是常量(它们不能是变量)。Boost.Preprocessor 模块有很多关于如何和何时(滥用)使用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;
}

或者,如@Jack建议的那样,使用memset

+1,我认为DUP宏很聪明,尽管我同意这不是一个好主意。 - Marlon
+1 for 宏 (macro) 解决方案。但在 dupchar 函数中:必须检查 s 是否为非 NULL 值;我认为您可以在循环语句的第一个参数中放置有关变量声明的注释,这是 C99 功能;以 char 作为 c 的类型不是一个好主意,应该使用 int - Jack
@Jack:你对于 NULL 检查的观点是正确的,我已经修复了该函数以符合 C89 标准。不过,你为什么要用 int 值填充 char* 数组呢? - sfstewman
@TheMask:不能保证编译器会内联调用malloc并带有变量范围的for循环的函数。 - sfstewman

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;
}

“memset” 似乎是最干净的解决方案。 - primo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接