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

好吧,通常这样做的方法是按值返回(如果您知道数组的大小),返回 std::string (和按值),或者将结果作为指针参数传递并让调用者处理分配/没有输出缓冲区。

我推荐类似的东西:

std::string logMsg(const char *msg)
std::string logMsg(const std::string& msg)
于 2013-05-21T04:13:36.457 回答