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 プリプロセッサで行う方法は多数あります。これが1つです:

#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モジュールには、このように C/C++ プリプロセッサをいつどのように (ab) 使用するかについて、多くの優れた情報があります。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 に答える