0

这个想法是打印 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();
}
4

2 回答 2

3

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

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

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

于 2015-10-07T06:46:48.807 回答
1

setw()一次,然后输出x次。setw()只影响下一个输出,即第一个字符 - 按照您的指示从右到左设置 - 其余字符附加到它上面。

所以你的内循环(用一个循环计数器遮住外循环……颤抖)不能按预期工作——你需要一次性打印你的形状线setw()才能有效。这可以通过一个相当有用的std::string构造函数来完成:

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

用字符 ch 的 count 个副本构造字符串。如果 count >= 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代码),但我想保持接近您的原始代码。

于 2015-10-07T06:57:26.757 回答