【问题标题】:setw working on alphabets but not on dashes and underscoressetw 处理字母但不处理破折号和下划线
【发布时间】:2021-11-11 05:11:15
【问题描述】:

这是使用空格给出我想要的输出的代码,但我必须使用 setw 执行任务,这不是我想要的(附加第二个代码)。请帮忙!

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout <<     "           _________________________________________________________" <<endl ;
cout <<     "          /                                                         \\ " <<endl;
cout <<     "         /                                                           \\ " <<endl;
cout <<     "        /                                                             \\ " <<endl;
cout <<     "       /                                                               \\ " <<endl;
cout <<     "      /                                                                 \\ " <<endl;
cout <<     "     /                                                                   \\ " <<endl;


return 0;
}

所需的无效代码:

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout << setw(15) <<    "_________________________________________________________" <<endl ;
cout <<  setw(14)<<   "/                                                          \\ " <<endl;
cout <<  setw(13)<<  "/                                                            \\ " <<endl;
cout <<  setw(12)<< "/                                                              \\ " <<endl;
cout <<  setw(11)<<"/                                                                \\ " <<endl;
cout << setw(10)<<"/                                                                  \\ " <<endl;
cout << setw(9)<<"/                                                                    \\ " <<endl;


return 0;
}

想要的输出:

           _________________________________________________________
          /                                                         \
         /                                                           \
        /                                                             \
       /                                                               \
      /                                                                 \
     /                                                                   \

【问题讨论】:

  • 您误解了setw 的工作原理。该参数是输出的总宽度,在您的示例中,输出的宽度始终大于您传递给setw的参数
  • 您能解释一下为什么使用代码中使用的 setw 值吗?为什么你认为它适用于字母而不适用于破折号?
  • 那么我应该怎么做,因为我只能用 setw 来执行这个任务。
  • 我使用 setw 值而不是空格
  • 语法正确,宽度错误。为什么选择15

标签: c++ setw


【解决方案1】:

我不明白你希望setw 做什么。它的作用是:它设置输出的宽度。例如

std::cout << std::setw(5) << 12;

输出结果

   12
^ ^ 3 spaces
^   ^ total width = 5

这会导致所需的输出在前面有更多空格(因为我懒得计算确切的数量,所以我把它留给你):

#include<iostream>
#include<iomanip>
int main()
{
    std::cout << std::setw(70) <<    "_________________________________________________________" << std::endl ;
    std::cout << std::setw(71) << "/                                                          \\ " << std::endl;
    std::cout << std::setw(72) << "/                                                            \\ " << std::endl;
    std::cout << std::setw(73) << "/                                                              \\ " << std::endl;
    std::cout << std::setw(74) << "/                                                                \\ " <<std::endl;
    std::cout << std::setw(75) << "/                                                                  \\ " <<std::endl;
    std::cout << std::setw(76) << "/                                                                    \\ " <<std::endl;

}

Live Demo

对于奖励积分,您也可以查看std::setfill。它设置用于填充输出的字符。例如:

std::cout << std::setfill('x') << std::setw(5) << 12 << std::setfill(' ');

输出结果

xxx12

std::setfill 是粘性的,所以当你想再次使用默认的空格填充字符时,你必须重新设置它。使用循环,您的代码可以只是

std::cout << std::setw(15) << "_" << std::setw(40) << std::setfill('_') << "_" <<endl ;
std::cout << std::setfill(' ');
for (int i=0;i<6;++i){
    std::cout <<  setw(14-i) << "/" << std::setw(43+i*2) << "\\ " <<endl;
}

【讨论】:

  • 我现在真的明白了 setw 是如何工作的。谢谢老兄。
【解决方案2】:

您现在可能已经了解 setw 的工作原理了,所以这里有一个基于您的问题的最小工作代码。只需添加一个专用字符 (空格或其他)作为每个 setw 的目标:

#include <iostream>
#include <iomanip>
using namespace std;
int main() {
 cout << setw(14) << ' '  << setw(59) << setfill('_') << '_' << setfill(' ') << endl; 
 cout << setw(14) << '/' << setw(60) << '\\' << endl;                                                 
 cout << setw(13) << '/' << setw(62) << '\\' << endl;                                                 
 cout << setw(12) << '/' << setw(64) << '\\' << endl;                                                 
 cout << setw(11) << '/' << setw(66) << '\\' << endl;                                                 
 cout << setw(10) << '/' << setw(68) << '\\' << endl;                                                 
 cout << setw(9)  << '/' << setw(70) << '\\' << endl;                                                 

 return 0;
}

我检查了,这段代码产生了你想要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 2014-09-12
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    相关资源
    最近更新 更多