• 締切済み

ログ出力関数

C言語で、「可変長引数」を受け取る ログ出力関数を作っています。 /* ------------------------------------------------------ */ #include <stdio.h> #include <stdarg.h> void my_logger(char *format, ...) { va_list argptr; va_start(argptr, format); vprintf(format, argptr); va_end(argptr); } int main(void) { int n = 0; my_logger("logger : hello (%d)\n", n++); my_logger("logger : thank you (%d)\n", n++); my_logger("logger : bye (%d)\n", n++); return 0; } <実行結果> logger : hello (0) logger : thank you (1) logger : bye (2) /* ------------------------------------------------------ */ 出力する文字列に、"logger : "を毎回記述するのは面倒なので my_logger関数の中で"logger : "を追加したいのですが どうすればいいでしょうか。 ↓みたいなのもありかもしれませんけど、何だかねぇ、、、って感じですし -- 省略 -- va_start(argptr, format); printf("logger : "); vprintf(format, argptr); va_end(argptr); -- 省略 -- ↓のようなマクロを使う手もありますけど、、、わけあって使えません。 #define my_logger(fmt, ...) printf("logger : " fmt, __VA_ARGS__) どなたか、ご教授お願いします。

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

自分なら「何だかねえ、、、」のやり方にします。 これが一番簡単で普通ではないでしょうか。 私には全く「何だかねえ」には思えませんよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 可変長引数の扱い

     以下のプログラムが、 Hello,world. Hello, という出力しかしません。どうしてでしょう?  もしこういったことはcでは無理なのだとすれば、printfやsyslogなどのフォーマット指定のある出力関数のラッパーを書く他のいい方法があるんでしょうか? #include <stdio.h> #include <stdarg.h> #include <stdlib.h> void messout(const char *format, ...); int main(void) {   char *str = "world.";   printf("Hello,%s\n", str);   messout("Hello,%s\n", str);   exit(0); } void messout(const char *format, ...) {   va_list list;   va_start(list, format);   printf(format, list);   va_end(list); }

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 自作の関数を見てください。

    私が作った関数がこれでいけるか気になったので、 評価してください。 内容は、決められた文字が入力されるまでループを繰り返すというものです。 評価して欲しい内容・・・ 1.関数名や変数名 2.strchrの使い方 3.その他だめなとこがあったらすべて お願いします。 ソース(わかりやすいようにmain関数もつけます): #include<stdio.h> #include<string.h> #include<stdarg.h> char Input_True_char(char *str,char *format,...); int main(void) { char mozi; mozi = Input_True_char("ny","あなたは%d才以上ですか?(y/n)\n",18); if(mozi == 'y') { printf("18才以上です\n"); } else if(mozi == 'n') { printf("18才未満です\n"); } else { printf("バグ\n"); } return 0; } char Input_True_char(char *str,char *format,...) { char mozi[3]; va_list args; va_start(args,format); do{ vfprintf(stdout,format,args); rewind(stdin); fgets(mozi,sizeof(mozi),stdin); }while(mozi[1] != '\n' || strchr(str,mozi[0]) == NULL); va_end(args); return mozi[0]; }

  • サブ関数、メイン関数

    C言語の質問です! ランダムに九九の計算を出題して、キーボードから答えを入力し、正解かどうかを判定するプログラムをつくりたいです。出題の部分をサブ関数、判定の部分をメイン関数として作成する場合、どのようなプログラムの書き方になるのか、教えてください! #include<stdio.h> #include<stdlib.h> #include<process.h> void kakezan(void); void answer(void); void hanrei(void); int a,b,c; int main() { printf("やめるときは、100と入力してください。\n");   while(1){ kakezan(); answer(); hantei(); } return 0; } void kakezan(void) { a=rand() %10; b=rand() %10; printf("%d×%d=",a,b); } void answer(void) { scanf("%d",&c); if(c==100) exit(0); } void hantei(void) { if(c==a*b) printf(">>正解\n"); else printf(">>不正解\n"); printf("\n"); return; } 一応考えてみたのですが、 ちゃんと、判定→メイン  出題→サブ関数になっているのかなとおもって・・・   このプログラムであっているのでしょうか??

  • printf()で出力したいんですが?

    #include <stdio.h> int main( void ) { int air[4]; int i; i = 0; printf( "データ入力\n" ); do{ scanf( "%d\t", &air[ i++ ]); } while(air[ i - 1 ] > 0 ); printf( "%d\n", i ); return 0; } このプログラムはコンパイル出来ますが、期待していたprintf関数での出力ができません。 その理由として何がありますか?関数の使い方が間違っているのか、DO~WHILE文が使えない場所 なのか、もし直すとすればどう直せばいいのですか。

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

  • 素数 再帰関数

    メイン #include<stdio.h> extern void count_primes(void); extern void print_primes(void); int max; int count; int primes[1000] int main(void) { printf("Uper limit: "); scanf("%d",&max); count_primes(); print_primes(); } 素数を求める(関数呼び出し) extern int nextprime(int n); extern int max; extern int count; extern int primes[]; void count_primes(void) { int i; count=0; for(i=2;i<=max;i=nextprime(i)){ primes[count++]=i; } リカーバシブ(次の素数) int nextprime[int n] { int i; for(;;){ n++; for(i=2;i*i<=n;i=nextprime(i)){ if(n%i==0) break; } if(i*i>n) break; } return n; } 素数プリント #include<stdio.h> extern int count; extern int primes[]; void print_primes(void) { int i for(i=0;i<count;i++){ if((i>0)&&(i%10==0) printf("\n"); printf(" %6d",primes[i]); } printf("\n素数の数 %d\n",count); } これら4つのモジュールで素数 nが求められますがアルゴリズム理解できません。この2つの関数のアルゴリズムについて、ご教授ください。め

  • 配列の動的確保を関数化

    main()内でいくつかの配列を動的確保するとごちゃごちゃするので、 関数化してみました。しかし、下のプログラムではうまい事いきませ んでした。 #include<stdio.h> #include<stdlib.h> void array1d(int *box,int n) { int i; box=(int *)malloc(n * sizeof(int)); for(i=0; i<n; i++) { box[i]=0; } } main() { int *pol,i,n; printf("N pol\nN = "); scanf("%d",&n); array1d(pol,n); for(i=0; i<n; i++) { printf("[%d]=%d\n",i,pol[i]); } } 実行結果は [0]=-14646387 [1]=-1819410433 [2]=-224 array1d内では0を格納していますが、このようになりました。 どのようにすれば 0になるでしょうか? 回答よろしくお願いします。

  • 関数の再帰処理

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657... という数列(フィボナ数列)を再帰処理でだしたいのですが・・・・・ include <stdio.h> int function( int ); int main( void ){ int n; do { printf( "0 以上の整数値を入力して下さい→ " ); scanf( "%d", &n ); }while ( n < 0 ); printf( "計算結果: %d\n", function( n ) ); getchar(); getchar(); return 0; } int function( int n ){ //フィボナの処理(function)の再帰呼び出しによる } function内に再帰処理を用いてprintf( "計算結果: %d\n", function( n ) );で画面出力したいのですが・・・・・・。