Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定strftime字符数组最大大小的智能方法是什么?_C++_Strftime_Mktime - Fatal编程技术网

C++ 确定strftime字符数组最大大小的智能方法是什么?

C++ 确定strftime字符数组最大大小的智能方法是什么?,c++,strftime,mktime,C++,Strftime,Mktime,如何在没有反复试验的情况下调整字符数组的strftime大小?使用mktime,示例中的时间戳大小N必须大于86,否则返回任意日期。 e、 g N=86:2013-07-13 02:41 N=82:1979-05-1813:23 如何在事先不知道日期的情况下有效地缩放N?检查>0没有帮助 #include <iostream> #include <cstring> #include <ctime> #define N 86 using namespace

如何在没有反复试验的情况下调整字符数组的strftime大小?使用mktime,示例中的时间戳大小N必须大于86,否则返回任意日期。 e、 g

N=86
2013-07-13 02:41

N=82
1979-05-1813:23

如何在事先不知道日期的情况下有效地缩放N?检查>0没有帮助

#include <iostream>
#include <cstring>
#include <ctime>

#define N 86

using namespace std;

int main(void)
{
time_t t;
struct tm ts;
char timestamp[N] ;

ts.tm_min    = 41;     
ts.tm_hour   = 2;     
ts.tm_mday   = 13;
ts.tm_mon    = 7 - 1;      
ts.tm_year   = 13 - 1900 + 2000;         

t = mktime(&ts);

if (strftime(timestamp, sizeof(timestamp)-1, "%Y-%m-%d %H:%M", &ts) > 0)
    cout << timestamp;
else {
    cerr << "strftime failed." <<endl;
    return 1;
}

return 0;
}
#包括
#包括
#包括
#定义N 86
使用名称空间std;
内部主(空)
{
时间;
struct-tm-ts;
字符时间戳[N];
ts.tm_min=41;
ts.tm_小时=2;
ts.tm_mday=13;
ts.tm_mon=7-1;
ts.tm_年=13-1900+2000年;
t=mktime(&ts);
如果(strftime(时间戳,sizeof(时间戳)-1、%Y-%m-%d%H:%m,&ts)>0)

从strftime的文档中可以看出:

如果生成的C字符串(包括终止的空字符)的长度不超过maxsize,则函数返回复制到ptr的字符总数(不包括终止的空字符)。否则,它返回零,并且ptr指向的数组的内容不确定

这意味着,如果您不知道字符串的大小,并且可以动态分配字符串,则可以执行以下操作:

int size = N; //  Some starting size
char *timestamp = malloc(size);

//  Your time stuff

int result = strftime(timestamp, size - 1, "%Y-%m-%d %H:%M", &ts);

// While there isn't enough room to store the result
while (result == 0)
{
  free(timestamp);  //  Free old data
  size *= 2;        //  Double the size (should be more than enough)
  timestamp = malloc(size); //  Allocate the new size. You can check for failed allocations here as well.

  //  Retry
  result = strftime(timestamp, size - 1, "%Y-%m-%d %H:%M", &ts);
}

std::cout << timestamp;
int size=N;//一些起始大小
char*timestamp=malloc(大小);
//你的时间
int result=strftime(时间戳,大小为-1,“%Y-%m-%d%H:%m”,&ts);
//虽然没有足够的空间来存储结果
而(结果==0)
{
释放(时间戳);//释放旧数据
大小*=2;//大小的两倍(应该足够大)
timestamp=malloc(size);//分配新的大小。您也可以在此处检查分配失败的情况。
//重试
结果=strftime(时间戳,大小为-1,“%Y-%m-%d%H:%m”,&ts);
}

STD::CUT

,因为你把它标记为C++,也许你可以考虑以下内容:

-->请注意,这里没有字符串大小的问题


//用于创建时间戳样式字符串的函数
std::字符串yydmmdd_hhCmmGet(time_tt)
{
std::stringstream-ss;
//目标-类似于:“%Y-%m-%d%H:%m”
{
struct tm mybdtod;//linux api:我每天的故障时间
//以下是一个相对较慢的函数
::本地时间(tt和mybdtod);
//linux api-将时间转换为tm作为本地时间

ss这可能更多地与
ts
中未初始化的成员有关,这些成员会混淆
mktime
。在设置所需的成员之前,尝试
memset(&ts,0,sizeof(ts));
,这样
tm_sec
等就可以保证
0
…或者只是初始化它-
tm-ts{};
(这是C++,所以不需要<代码>结构> <代码>不确定为什么您认为需要一个可变长度。根据您的格式字符串,所有日期/时间的长度都将完全相同。好的方面是,初始化可以解决问题。我只是想知道为什么在未初始化
ts
成员的情况下,正确的结果取决于字符串长度?所有变量都是堆栈上的局部变量。更改一个地址的大小可能会改变其他地址的大小,以便这些地址中的任何随机数据都不会引起问题。
malloc
而不是
std::string
?Tsk。我坚持OP使用
char[]使用代码< >代码> STD::String 是一个不同的答案,你可以自由地发表。因为OP使用C++,他可能会更喜欢这个答案。我很好奇:你将如何使用<代码> STD::Stry::Stry::CyString():/Cord>和<代码>:STD::DATA():/COD>是const。我使用的是代码> STD::UNQuyYPPTR时间戳(新字符)[尺寸];
// function to create a timestamp style string 
std::string   yyDmmDdd_hhCmmGet(time_t tt)
{
   std::stringstream ss;
   // goal - something like:  "%Y-%m-%d %H:%M"
   {
      struct tm mybdtod; // linux api: my broken down time of day

      // the following is a relatively slow function
      ::localtime_r (&tt, &mybdtod);
      // linux api - convert time_t to tm as local time

      ss << std::setw(4) << (mybdtod.tm_year+1900) 
         << "-"
         << std::setfill('0') << std::setw(2) << mybdtod.tm_mon+1 
         << "-"
         << std::setfill('0') << std::setw(2) <<  mybdtod.tm_mday   
         << " ";

      ss << std::dec << std::setfill('0')  << std::setw(2) 
         << mybdtod.tm_hour 
         << ":"
         << std::setfill('0')  << std::setw(2) 
         << mybdtod.tm_min;
   }
   return(ss.str());
}


int t186(void)
{
   struct tm ts; // linux api: time struct
   ::memset(&ts, 0, sizeof(tm));

   ts.tm_min    = 41;
   ts.tm_hour   = 3-1;
   ts.tm_mday   = 13;
   ts.tm_mon    = 7 - 1;
   ts.tm_year   = 13 - 1900 + 2000;

   time_t tt = mktime(&ts); // linux api: Convert tm struct to time_t

   // format time_t to string
   std::string s = yyDmmDdd_hhCmmGet(tt); // timestamp style

   std::cout << "\n" << s 
             << "\n            s.size(): " 
             << s.size() << " chars" << std::endl;

   // now we know how many chars timestamp needs 

   // add 1 to size because ?strftime seems to need it?
   char timestamp[s.size()+1];  

   (void)strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M", &ts);
   // linux api: format time_t to string

   std::cout << "\n" << timestamp << std::endl;
   std::cout << "   sizeof(timestamp): " 
             << sizeof(timestamp) << " chars" << std::endl;

   return(0);
 }