c ++ setw没有按照我需要的方式工作

时间:2015-10-07 06:25:28

标签: c++ setw

这个想法是打印4个形状,前两个形状打印精细,接下来的两个形状使用setw意味着镜子,但仍然打印低于它们。

我的理解是setw制作了一种文本框,它从参数中指定的文本位置开始从右到左输出,它适用于我尝试过的其他示例。但由于某些原因,当通过这些for循环时,它只是添加了设定数量的制表空间,并打印在setw位置的错误一侧。

#include <conio.h>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
   int x = 1;
   for (int i = 0; i < 9; i++)
   {
      for (int i = 1; i <= x; i++)
         cout << "*";
      x++;
      cout << endl;
   }

   cout << endl;
   x = x - 1;

   for (int i = 0; i < 9; i++)
   {
      for (int i = 1; i <= x; i++)
         cout << "*";
      x--;
      cout << endl;
   }

   cout << endl;
   for (int i = 0; i < 9; i++)
   {
      cout << setw(10);
      for (int i = 1; i <= x; i++)
         cout << "*";
      x++;
      cout << endl;
   }

   cout << endl;
   for (int i = 0; i < 9; i++)
   {
      cout << setw(10);
      for (int i = 1; i <= x; i++)
         cout << "*";
      x--;
      cout << endl;
   }
   _getch();
}

2 个答案:

答案 0 :(得分:2)

我无法看到您的输出,但此信息可能有所帮助。

setw用于指定下一个数字或字符串值的最小空间。这意味着如果指示的空间大于数值或字符串,则会添加一些填充。

最重要的是setw不会更改输出流的内部状态,因此它只会确定下一个输入的大小,这意味着它只适用于for循环的第一次迭代。

答案 1 :(得分:0)

setw()一次,然后输出x次。 setw()仅影响 next 输出,即第一个字符 - 按照您的指示从右向左设置 - 并附加剩余的字符。

所以你的内环(用一个环形计数器遮住外部的一个...... 颤抖)无法正常工作 - 你需要一次性打印你的形状线setw()要有效。这可以通过一个非常有用的std::string构造函数来完成:

basic_string( size_type count,
              CharT ch,
              const Allocator& alloc = Allocator() );
  

构造具有字符ch的计数副本的字符串。如果count> gt = = npos。

,则行为未定义

(资料来源:cppreference.com

然后就是第三种形状的问题,其中一条线比另一条线少。

固定代码:

#include <iostream>
#include <iomanip>
#include <string>

// <conio.h> is not available on non-Windows boxes,
// and if MSVC were smart enough to keep the console
// window open, this kludge wouldn't be necessary
// in the first place.
#ifdef _WIN32
#include <conio.h>
#endif

using namespace std;

int main()
{
   int x = 1;
   for (int i = 0; i < 9; i++)
   {
      cout << string( x, '*' ) << "\n";
      x++;
   }

   cout << endl;
   x = x - 1;

   for (int i = 0; i < 9; i++)
   {
      cout << string( x, '*' ) << "\n";
      x--;
   }

   cout << endl;

   for (int i = 0; i < 9; i++)
   {
      // increment first, or the loop will not print
      // the last line, making the third shape different.
      x++;
      cout << setw(10) << string( x, '*' ) << "\n";
   }

   cout << endl;

   for (int i = 0; i < 9; i++)
   {
      cout << setw(10) << string( x, '*' ) << "\n";
      x--;
   }

#ifdef _WIN32
   _getch();
#endif
}

这可以通过创建一个 string进一步简化,然后在每个循环中打印它的子串(而不是每次都创建一个新的临时string),但是我想要接近原始代码。