带输出操纵器的C ++ int

时间:2013-10-30 17:24:58

标签: c++ int output manipulators

我正在破坏我的大脑试图弄清楚这一点。请耐心等待,因为我只是在第四周学习C ++。

当将所有代码放在main()

中时,下面的代码工作正常
int main()
{   
    cout << setfill('0') << setw(1) << hundreds << setw(1) << tens
        << setw(1) << units << "\n";
    system("PAUSE");
    return 0;
}

但是我被要求让它工作以便代码被拆分,但我似乎无法做到。我的尝试如下。如果有人能把我送上正确的轨道,那就太好了。请记住,我们没有学到任何复杂的东西,所以它应该不难。

int main()
{
    cout << "The encrypted number is: " << recomposedEncryptedNumber() << "\n";
    system("PAUSE");
    return (0);
}

int recomposedEncryptedNumber()
{    
    return setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}

5 个答案:

答案 0 :(得分:2)

表达式cout << stuffcout作为返回值,因此您需要在函数中执行相同的操作:

std::ostream& recomposedEncryptedNumber()
{    
   return cout << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;
}

答案 1 :(得分:1)

您是否在main之前声明了原型?例如。我没有更多时间来解释,但这是你将如何做到这一点

#include <iostream>
    #include <iomanip>

    using namespace std;
    void recomposedEncryptedNumber(int hun, int tens, int units);

    int main()
        {
        int hun = 1;
        int tens = 1;
        int units = 1;
        cout << "The encrypted number is: " << "\n";
        recomposedEncryptedNumber(hun,tens,units);
        system("PAUSE");
        return (0);
        }

       void recomposedEncryptedNumber(int hun, int tens, int units)
       {    
       cout << setfill('0') << setw(1) << hun << setw(1) << tens << setw(1) << units;
       }`

答案 2 :(得分:1)

您的初始代码在一行中结合了很多。我把它拆开了解释:

int main()
{   
    cout    // cout is "console output" -- i.e. how you print to the screen
      << setfill('0')  // This is the operation "cout << setfill('0')"
                       // which creates a modifier "setfill", passes it to cout,
                       // and now you've "taught" cout to use '0' as the fill
                       // character.
                       // Importantly, "cout << setfill('0')" returns cout...
      << setw(1)       // This is the operation "cout << setw(1)".
                       // It's applying the "<< setw(1)" to the return of the
                       // previous command.  This is also a special modifier,
                       // and again, this returns 'cout'.
      << hundreds      // Now you're finally printing something, because this
                       // is doing "cout << hundreds"
      << setw(1)
      << tens
      << setw(1)
      << units
      << "\n";
    system("PAUSE");
    return 0;
}

重要的是,该长行中的每个操作都是cout << {something}<<操作的结果再次是cout - 这就是为什么你可以将这些语句链接在一起。< / p>

知道了,你现在应该能够看到为什么失败了:

int recomposedEncryptedNumber()
{    
   return
     setfill('0')         // This gives you the setfill modifier.
                          // -- but that's _not_ cout.
        << setw(1)        // "setfill << setw"??  Not what you want at all.
                          // You want "cout << setfill" and "cout << setw".
        << hundreds << setw(1) << tens << setw(1) << units;
}

您有很多选项可供选择。你可以这样做:

int main() {
   cout << "The encrypted number is: ";
   printRecomposedEncryptedNumber();
   cout << "\n";
}

这是三个单独的陈述。现在printRecomposedEncryptedNumber可以直接将您的详细信息打印到cout,并返回void(即不返回任何内容)。

如果你想内联:

int main() {
    cout << "The encrypted number is: " << recomposedEncryptedNumber() << "\n";
}

然后,您的recomposedEncryptedNumber必须返回可以提供给cout的内容。因为你正在尝试做一些特殊的格式化,所以你不想使用int - cout只会以它想要的方式显示int。所以你应该使用一个字符串。然后你的函数可以做任何想要的格式化,并返回格式正确的字符串:

string recomposedEncryptedNumber(int hundreds, int tens, int units)
{    
    std::ostringstream msg;  // 'o' is for output
                             // 'string' is because we're building a string
                             // 'stream' is because this uses streaming methods
                             // i.e. 'ostringstream' lets us build a string,
                             // by using streaming mechanisms.

    //  Same stream machinations you were doing before, just with 'msg'
    // instead of 'cout'
    msg << setfill('0') << setw(1) << hundreds << setw(1) << tens << setw(1) << units;

    return msg.str();    // return the string we've built.
}

最后,为了让您的函数能够访问hundredstensunits,必须为函数提供这些变量(即变量必须传入函数作为参数)。

欢迎使用C ++!

答案 3 :(得分:0)

cout在标准输出上打印,你试图混合使用2种类型,这就是为什么它不起作用。

试一试:

std::string recomposedEncryptedNumber()
{    
    std::string str;
    concat(str,setfill('0'));
    concat(str,setw(1));
    ...
    return str;
}

答案 4 :(得分:0)

那么,

这就是我如何实现我认为你需要的东西:

#include    <iostream>
#include    <iomanip>

using namespace std;

class EncryptedNumber
{
public:
    EncryptedNumber( unsigned h, unsigned t, unsigned u )
    :   hundreds( h ),
        tens( t ),
        units( u )
    {}

protected:
    unsigned        hundreds,
                    tens,
                    units;

    friend std::ostream & operator << ( std::ostream& outs, const EncryptedNumber& en );
};

std::ostream & operator << ( std::ostream& outs, const EncryptedNumber& en )
{
    outs    << setfill( '0' ) << setw( 1 ) << en.hundreds
            << setw( 1 ) << en.tens
            << setw( 1 ) << en.units;

    return  outs;
}


int main()
{
    EncryptedNumber en( 1, 2, 3 );

    cout << "The encrypted number is: " << en << "\n";
    system("PAUSE");
    return (0);
}

当然这是一个快速的解决方案,我没有创建getter / setter方法,没有从实现中分离概念,并且在EncryptedNumber中没有任何用处。 关键是代码看起来会更加优雅和可持续发展。

如果您想要更详细的解释,请告诉我。