关于如何创建一个接受字符串并返回带有日期和时间的字符串的C函数的想法

关于如何创建一个接受字符串并返回带有日期和时间的字符串的C函数的想法,c,string,function,dynamic,character,C,String,Function,Dynamic,Character,我是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)

我是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;
}
我知道这是一个非常糟糕的主意,因为我每次调用这个函数时都会分配一个新内存,但这正是我想要的功能。我不想将我的消息限制在预定义的长度内


仅仅是一个想法或设计模式将非常有用。非常感谢

正确答案取决于您打算如何使用该函数。据我所知,您正在使用此函数创建一个日志字符串,您将在程序中多次使用它。按照当前的方法,在每次调用logMsg之后,您的代码都会充满对free()的混乱调用。让调用者分配内存将使您的代码充满calloc和free

我建议您让调用者担心内存分配,这是C通常的做法(请参阅您使用的strftime()。尽管您提到不希望限制消息的长度,但我建议在调用程序中分配一次足够大的限制,并在最后分配一次免费消息。这将避免过多调用calloc和free


希望这有帮助。

通常,实现这一点的方法是按值返回(如果您知道数组的大小),返回std::string(和按值),或将结果作为指针参数传递,并让调用方处理分配/释放输出缓冲区

我推荐如下:

std::string logMsg(const char *msg)
std::string logMsg(const std::string& msg)

一个选项是强制调用方预先分配额外内存。我同意@RichardJ.RossIII-另外,不要强制转换
malloc()的返回值
和系列。问题是什么?上面的代码有什么问题?只要调用调用方释放内存的要求,返回已分配内存没有什么错。正如其他人所提到的,你的问题是什么?谢谢你的深刻回答。来自更高级别的语言,这些概念被抽象为我所使用的(SAP ABAP)。这就是为什么我不知道如何用通常用C语言完成的方法来解决这个问题。我能理解,很高兴我能帮上忙。