我正在开发一个项目,我有一个Time类,我需要格式化时间。
void Time::FormatTime(char *string, unsigned int max_string_len) {
ostrstream fd;
ft << hour << ":" << minutes;
cout << ft.str() << endl;
}
用户传入指向其字符串的指针和字符串的最大长度,我需要检查时间字符串是否不长于max_string_len,如果是,则截断它。我不知道怎么做截断,因为我写了任何C ++已经有一段时间了。
如果可能,我不想使用STL。
谢谢
答案 0 :(得分:2)
这样做你想要的:
void Time::FormatTime(char *string, unsigned int max_string_len) {
ostrstream fd;
ft << hour << ":" << minutes;
std::string str = ft.str();
str.resize(max_string_len);
strcpy(string, str.c_str());
}
编辑:由于potatoswatter和quanmrana的有用反馈,我已经更新了我的代码。
答案 1 :(得分:2)
if( str.length() > max_string_len )
{
str = str.substr( 0, max_string_len );
}
strncpy( string, str.c_str(), max_string_len );
答案 2 :(得分:2)
始终使用strncpy()
将字符串安全地截断为char[N]
。
void Time::FormatTime(char *str, unsigned int max_string_len) {
if ( max_string_len == 0 ) return;
ostringstream ft; // strstream is obsolete, use stringstream
ft << hour << ":" << minutes;
strncpy( str, ft.str().c_str(), max_string_len );
str[ max_string_len - 1 ] = 0;
}
答案 3 :(得分:1)
如果可以修改第一个参数,那么你可以将0放在正确的位置作为字符串终止符,但这是一个相当讨厌(但很快)的解决方案。否则,您将需要创建一个新的字符数组,并且只复制正确数量的字符,记住为零终止符分配一个额外的字符。
答案 4 :(得分:1)
我猜你想要什么,但我认为它类似于以下内容,我在假设或改变:
ft
确实应该是fd
ostringstream
个对象而不是ostrstream
max_string_len
是字符中目标缓冲区的大小(包括将包含'\ 0'终结符的字符)std::cout
的格式化字符串并不感兴趣,但希望它在调用方提供的缓冲区中string
的名称更改为s
,因此不会与std:string
类型混淆。代码:
void Time::FormatTime(char *s, unsigned int max_string_len) {
if (max_string_len == 0) {
return; // no buffer, bail out
}
std::ostringstream fd;
fd << hour << ":" << minutes;
size_t len = fd.str().copy( s, max_string_len - 1); // leave room for the null terminator
s[len] = '\0';
}
如果你真的不想要STL的任何部分,那么下面的C风格的代码应该可以解决这个问题:
void Time::FormatTime(char *s, unsigned int max_string_len) {
snprintf( s, max_string_len, "%02u:%02u", hour, minutes);
}
它更简单,但C ++开发人员可能不喜欢使用printf()
系列,因为它不是类型安全的。
答案 5 :(得分:0)
根据您的要求,您似乎打算编写C而不是C ++,但我想这是您的业务。但是,对于您的规范,似乎正确的答案是strftime()
。