C++ 确定strftime字符数组最大大小的智能方法是什么?
如何在没有反复试验的情况下调整字符数组的strftime大小?使用mktime,示例中的时间戳大小N必须大于86,否则返回任意日期。 e、 g N=86: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
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);
}