如何初始化一个char指针,然后使用sprintf创建一个字符串

时间:2016-03-27 17:07:39

标签: c string c-strings

我正在创建一个以某种格式输出当前系统时间的函数。

char *get_time() {
    char *current_time;
    time_t rawtime;
    struct tm *timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    sprintf(current_time, "[%d/%d %d:%d] # ", timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_hour, timeinfo->tm_min);

    return current_time;
}

char *current_time需要在sprintf()中使用之前进行初始化。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

自C99以来,复合文字为内存分配提供了一个很好的解决方案。 get_time()的返回值有效,直到块结束

#include <stdio.h>
#include <time.h>
#define GET_TIME_N 17
#define GET_TIME()  get_time((char[GET_TIME_N]) { ""}, GET_TIME_N)

char *get_time(char *current_time, size_t n) {
  time_t rawtime;
  struct tm *timeinfo;
  time(&rawtime);
  timeinfo = localtime(&rawtime);
  snprintf(current_time, n, "[%d/%d %d:%d] # ", timeinfo->tm_mday,
          timeinfo->tm_mon + 1, timeinfo->tm_hour, timeinfo->tm_min);
  return current_time;
}

int main(void) {
  printf("%s\n%s\n%s\n", GET_TIME(), GET_TIME(), GET_TIME());
}

输出

[27/3 12:33] # 
[27/3 12:33] # 
[27/3 12:33] # 

答案 1 :(得分:1)

如果无法确定进入目标字符串的字符数量snprintf(),则允许通过附加项来计算所需的大小&#34; fake&#34;调用

从C11草案:

int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
     

snprintf函数返回已写入的字符数   已经足够大,不计算终止空字符,或负数   如果发生编码错误,则返回值。

示例:

char * unknown_sized_string(const char * str)
{
  char * buffer = NULL;

  int size = snprintf(buffer, 0, 
    "I do not known how long this will be: %s", str);

  if (0 <= size)
  {
    buffer = malloc(size + 1);

    if (NULL != buffer)
    {
      snprintf(buffer, size,
        "I do not known how long this will be: %s", str);
    }
  }

  return buffer;
}

答案 2 :(得分:0)

char *current_time = (char *) malloc(17)为最大大小的current_time以及空终止符分配足够的内存。