0

私はCにかなり慣れていないので、文字列を受け取り、現在の日付と時刻を前に付けて文字列を返す関数を書きたいと思います。いくつかのログ機能に必要ですが、出力ストリームに直接出力したくありません。

#define TIME_FORMAT "[%Y-%m-%d %H:%M:%S] "

char *logMsg(char *msg) {
  char timeStr[23];
  time_t tms;
  struct tm *localTime;

  tms = time(NULL);
  localTime = localtime(&tms);
  strftime(timeStr, sizeof(timeStr), TIME_FORMAT, localTime);

  int lenMsg = strlen(msg);
  int newLen = sizeof(timeStr) + lenMsg + 1;

  char *newStr;

  newStr = (char *) calloc(newLen,sizeof(char));
  strcat(newStr,timeStr);
  strcat(newStr,msg);
  return newStr;
}

この関数を呼び出すたびに新しいメモリを割り当てるので、これが非常に悪い考えであることはわかっていますが、これは私が望む機能です。メッセージを事前定義された長さに制限したくありません。

アイデアやデザインパターンだけでも非常に役立ちます。どうもありがとう!

4

2 に答える 2

1

正しい答えは、関数で何をするつもりかによって異なります。私が推測できることから、あなたはこの関数を使用してログ文字列を作成しており、これをプログラムで数回使用します。現在のアプローチでは、logMsg を呼び出すたびに free() への呼び出しが紛らわしいコードが散らばっています。呼び出し元にメモリを割り当てさせると、コードに calloc と free が散らばります。

C が通常行う方法であるメモリ割り当てについて、呼び出し元に心配させることをお勧めします (使用した strftime() を参照)。メッセージの長さを制限したくないとおっしゃいましたが、呼び出しプログラムで、十分に大きな制限で一度割り当て、最後に一度解放することをお勧めします。これにより、calloc と free の呼び出しが多すぎるのを回避できます。

お役に立てれば。

于 2013-05-21T04:01:02.230 に答える