c ++,截断一个char数组

时间:2010-02-09 20:18:56

标签: c++

我正在开发一个项目,我有一个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。

谢谢

6 个答案:

答案 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()