格式化C ++输出问题

时间:2011-09-19 17:23:20

标签: c++

让我举例解释我的问题,我的功能如下:

void printer(int width, int hight){
    for(int i=0;i<width;++i) std::cout<<" & ";
    for(int i=0;i<hight;++i) std::cout<<" ^ ";
    std::cout<<std::endl;
}

我的问题是功能打印机应该始终以相同的宽度输出两个for循环

e.g: 输出可能看起来(宽度5):

   &^
 &&&^

或者无论如何我打印任何(从上面的代码)for循环的输出以恒定的宽度独立于for循环执行

2 个答案:

答案 0 :(得分:3)

问题尚不清楚。您在寻找以下内容吗?

void printer(int amps, int carets, int overallWidth){
    for (int i = amps + carets; i < overallWidth; i++)  std::cout<<" ";  // leading padding
    for (int i=0;i<amps;++i) std::cout<<"&";
    for (int i=0;i<carets;++i) std::cout<<"^";
    std::cout<<std::endl;
}

更改只是添加一个用于输出填充的循环。 (为了清晰起见,还更改了参数名称)

printer(1,1,5);
printer(3,1,5);
然后

将产生示例中显示的输出

   &^
 &&&^

当然,不是作为参数传递,而是可以对overallWidth变量进行硬编码; printer()函数的隐式常量。

修改
上面的片段与问题的片段非常接近。然而,更多惯用方法,例如下面的“one liner”,它使用一个字符串构造函数重载来生成重复字符的字符串,并使用iomanip的setw()来生成填充。 / p>

void printer(int amps, int carets, int overallWidth){
   std::cout << setiosflags(ios::right) << setw(overalWidth) 
             << string(amps, '&') + string (carets, '^')
             << std::endl;
}

答案 1 :(得分:1)

查看<iomanip>。使用cout,您可以指定宽度。

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
   cout << setiosflags(ios::left) << setw(10) << "Hello"
        << setiosflags(ios::right) << setw(20) << "World!";

   return 0;
}