3

问题 -> 将固定长度的字符串返回到 std::string*。
目标机器 -> Fedora 11 。

我必须派生一个接受整数值并将固定长度的字符串返回到字符串指针的函数;
例如 -> int 值在 0 到 -127 的范围内

所以对于 int 值 0 -> 它应该显示 000
来表示值 -9 -> 它应该返回 -009
来表示值 -50 -> 它应该返回 -050
​​来表示值 -110 -> 它应该返回 -110

所以简而言之,长度在所有情况下都应该相同。

我做了什么:我已经根据如下所示的要求定义了功能。

我需要帮助的地方:我已经导出了一个函数,但我不确定这是否是正确的方法。当我在 Windows 端的独立系统上测试它时,exe 有时会停止工作,但是当我将此功能包含在 Linux 机器上的整个项目中时,它可以完美运行。

    /* function(s)to implement fixed Length Rssi */
 std::string convertString( const int numberRssi, std::string addedPrecison="" )
 {
     const std::string         delimiter   =   "-";
                stringstream   ss;

     ss  << numberRssi ;
     std::string tempString = ss.str();
     std::string::size_type found = tempString.find( delimiter );
     if( found == std::string::npos )// not found
     {
         tempString = "000";
     }
     else
     {
         tempString = tempString.substr( found+1 );
         tempString = "-" +addedPrecison+tempString ;
     }
     return  tempString;

 }

 std::string stringFixedLenght( const int number )
 {
     std::string str;
     if( (number <= 0) && (number >= -9) )
       {
           str = convertString( number, "00");
       }
       else if( (number <= -10) && (number >= -99) )
       {
           str = convertString( number, "0");
       }
       else
       {
           str= convertString(number, "");
       }
     return str;
 }
// somewhere in the project calling the function
ErrorCode A::GetNowString( std::string macAddress, std::string *pString )
{
    ErrorCode result = ok;
    int lvalue;
    //some more code like iopening file and reading file 
    //..bla
    // ..bla     
    // already got the value in lvalue ;

    if( result == ok )
    {
         *pString = stringFixedLenght( lValue );
    }

    // some more code

    return result;

}
4

5 回答 5

12

您可以使用I/O 操纵器来设置所需的宽度,并用零填充。例如,这个程序打印00123

#include <iostream>
#include <iomanip>

using namespace std;

int main() {
    cout << setfill('0') << setw(5) << 123 << endl;
    return 0;
}

但是,您必须自己处理负值:cout << setfill('0') << setw(5) << -123 << endlprints 0-123,而不是-0123. 检查该值是否为负,将宽度设置为N-1,并在前面添加一个减号。

于 2012-07-17T11:11:23.713 回答
12

如何使用std::ostringstream和标准输出格式化操纵器?

std::string makeFixedLength(const int i, const int length)
{
    std::ostringstream ostr;

    if (i < 0)
        ostr << '-';

    ostr << std::setfill('0') << std::setw(length) << (i < 0 ? -i : i);

    return ostr.str();
}
于 2012-07-17T11:15:12.843 回答
2

请注意,您的示例与您的描述相矛盾:如果值为 -9,并且固定长度为 3,则输出应该是“-009”(如您的示例)还是“-09”(如您所描述)?如果是前者,显而易见的解决方案是仅使用以下格式标志std::ostringstream

std::string
fixedWidth( int value, int width )
{
    std::ostringstream results;
    results.fill( '0' );
    results.setf( std::ios_base::internal, std::ios_base::adjustfield );
    results << std::setw( value < 0 ? width + 1 : width ) << value;
    return results.str();
}

对于后者,只需删除 , 中的条件std::setw并通过 width

作为记录,虽然我会避免它,但这是printfostream. 使用snprintf

std::string
fixedWidth( int value, int width )
{
    char buffer[100];
    snprintf( buffer, sizeof(buffer), "%.*d", width, value );
    return buffer;
}

您可能希望捕获 的返回值snprintf并在其后添加一些错误处理,以防万一(但char对于大多数当前机器来说,100 秒就足够了)。

于 2012-07-17T11:42:17.950 回答
0

像这样?

#include <cstdlib>
#include <string>

template <typename T>
std::string meh (T x)
{
    const char* sign = x < 0 ? "-" : "";
    const auto mag = std::abs (x);
    if (mag < 10)  return sign + std::string ("00" + std::to_string(mag));
    if (mag < 100) return sign + std::string ("0" + std::to_string(mag));
    return std::to_string(x);
}


#include <iostream>
int main () {
    std::cout << meh(4) << ' '
              << meh(40) << ' '
              << meh(400) << ' '
              << meh(4000) << '\n';
    std::cout << meh(-4) << ' '
              << meh(-40) << ' '
              << meh(-400) << ' '
              << meh(-4000) << '\n';
}

004 040 400 4000

-004 -040 -400 -4000

于 2012-07-17T11:08:07.203 回答
0

我对使用流的版本没有任何意见,但你可以自己做这一切,比你的代码更简单:

std::string fixedLength(int value, int digits = 3) {
    unsigned int uvalue = value;
    if (value < 0) {
        uvalue = -uvalue;
    }
    std::string result;
    while (digits-- > 0) {
        result += ('0' + uvalue % 10);
        uvalue /= 10;
    }
    if (value < 0) {
        result += '-';
    }
    std::reverse(result.begin(), result.end());
    return result;
}
于 2012-07-17T11:54:08.507 回答