我想为 C 风格函数编写一个方便的包装器 strftime .我已经找到了一些将字符数组转换为字符串的选项,反之亦然。这是我的代码:
std::string Time::getAsFormattedString ( const std::string& format , const size_t& maxStringSize = 999 )
{
char* timeArray = 0;
std::string timeString;
// [OPTION_0]
timeArray = reinterpret_cast <char*> (malloc(sizeof(char)*maxStringSize)));
// [OPTION_1]
timeArray = const_cast <char*> (timeString.c_str());
// [OPTION_2]
timeArray = &(*(timeString.begin()));
strftime(timeArray,maxStringSize,format.c_str(),&this->time);
timeString = timeArray;
// [OPTION_0]
free(timeArray);
return timeString;
}
№0 选项看起来很安全,因为在释放内存之前不会抛出任何异常(编辑:timeString = timeArray
可以抛出一个,该行需要 try-catch)
№1 const-casting 总是看起来像 hack
№2 似乎是最好的,我不知道它是否有问题
能否请您告诉我,哪一个是最安全、正确、最佳且可能是最佳实践。
谢谢。
最佳答案
您提出的选项都不是真正可以接受的;这 第二个和第三个甚至不会工作。在全局范围内,有两种 “可接受的”解决方案。
最简单的是:
char buffer[ 1000 ];
size_t n = strftime( buffer, sizeof( buffer ), format.c_str(), &time );
if ( n == 0 ) {
throw SomeError; // or you might just abort...
}
return std::string( buffer );
这有简单的优点,但你必须 将最大大小记录为界面中的约束。 (这对我来说似乎是一个合理的约束。)
或者,您可以删除约束:
std::vector<char> buffer( 100 );
size_t n = strftime( &buffer[0], buffer.size(), format.c_str(), &time );
while ( n == 0 ) {
buffer.resize( 2 * buffer.size() );
n = strftime( &buffer[0], buffer.size(), format.c_str(), &time );
}
return std::string( buffer.begin(), buffer.begin() + n );
(在 C++11 中,实际上在 C++03 中,您可以使用
std::string
直接,而不是 std::vector
。其中
在这种情况下,您需要对结果字符串调用 resize( n )
在归还之前。)
关于c++ - 字符串操作和内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17208490/