我很抱歉,如果之前已经解决了这个问题,但经过几个小时的搜索,我什么也没想到。我在C ++上已经足够新了,也许我只是在寻找合适的短语。
基本上,这是我的问题的简要说明。
我正在通过自己的教科书(面向对象的C ++编程,第四版)工作(没有教练)。在第2章末尾有一个练习(#8),要求学生学习这段代码:
long pop1=2425785, pop2=47, pop3=9761;
cout << setw(8) << "LOCATION" << setw(12)
<< "POPULATION" << endl
<< setw(8) << "Portcity" << setw(12) << pop1 << endl
<< setw(8) << "Hightown" << setw(12) << pop2 << endl
<< setw(8) << "Lowville" << setw(12) << pop3 << endl;
使用setfill()在城镇名称和人口之间添加句点。我已经在setw()的顶部有了所需的#include,并且据我所知,setfill()在同一个头文件中。
我正在使用Code :: Blocks 13.12(在教科书的建议下)使用Borland C ++编译器(免费的5.5版本)。当Code :: Blocks无法以setw()函数格式化(绿色)的方式自动格式化setfill()函数时,一些东西似乎关闭了。编译器甚至没有发出警告,但是当我运行程序时,我得到一个令人讨厌的“chapter2objectives.exe已停止工作”对话框。每次我运行这个东西,都会崩溃。
重要新更新
我刚刚安装了Orwell Dev C ++并在那里编译了这段代码。除了没有识别system("PAUSE")
命令(系统未定义)之外,编译并运行的代码没有崩溃。这可能是Code :: Blocks问题,也可能是其他一些奇怪的问题。
我几个星期以来一直在研究C ++。我已经完成了C ++ for Dummies的书,我有14年的业余JavaScript代码修补程序,我不知道这里发生了什么。
我尝试过几件事。显然setfill()接受char值;我一直在这样做:
long pop1=2425785, pop2=47, pop3=9761;
cout << setw(8) << "LOCATION" << setw(12)
<< "POPULATION" << endl
<< setw(8) << "Portcity" << setfill('.') << setw(12) << pop1 << endl
<< setw(8) << "Hightown" << setfill('.') << setw(12) << pop2 << endl
<< setw(8) << "Lowville" << setfill('.') << setw(12) << pop3 << endl;
我也尝试过很多移动setfill()。我经常在setw()之前在网上看到它,但我之前和之后都试过它,我已经尝试了一次多次,我已经尝试过它作为一个独立的“cout&lt;&lt; setfill( ) '';”在执行之前的行,我甚至尝试了一个我在参考站点上找到的替代fill()方法....似乎无论我在哪里放置setfill()命令,都应该在填充字符首次出现的确切位置在输出中整个程序崩溃。
我已经考虑过使用调试器了,但是我怀疑我会看到任何可以解决问题的事情 me 。我猜测(并且希望)这是一个问题,就像我在头上一样,比如Code :: Blocks中的一个bug,或者是Borland编译器中的一个怪癖(虽然作者说这本书中的所有代码都编译并运行了很好的Borland编译器。)
任何有任何我可能没有尝试过的建议的人,请告诉我!我讨厌有这样的事情,这显然不起作用!
修改 这是SSCCE(对我而言,谢谢!):
#include <cctype>
#include <iomanip>
#include <iostream>
using namespace std;
void ex8()
{
cout << "Now we'll be printing a table from an example, but with a little something extra thrown in." << endl;
//#8 Rewrite the WIDTH program so that the characters on each line between the location name and the population number are filled in with periods instead of spaces.
//Doesn't require anything that isn't already listed with #include (uses IOMANIP, I think)
//For some strange reason setfill() is broken here.
cout << "Begin exercise 8:" << endl;
long pop1=2425785, pop2=47, pop3=9761;
cout << setw(8) << "LOCATION" << setw(12)
<< "POPULATION" << endl
<< setw(8) << "Portcity" << setfill('.') << setw(12) << pop1 << endl
<< setw(8) << "Hightown" << setfill('.') << setw(12) << pop2 << endl
<< setw(8) << "Lowville" << setfill('.') << setw(12) << pop3 << endl;
}
int main()
{
int iEx;
while (true)
{
cout << "Enter an exercise number to execute (0 to exit): ";
cin >> iEx;
cout << endl;
if (iEx == 0)
{
break;
}
switch (iEx)
{
case 8:
ex8();
break;
default:
cout << "No such exercise has been written yet." << endl;
}
}
cout << "Exiting program." << endl;
//wait until user is ready before terminating program
//to allow the user to see the program results
system("PAUSE");
return 0;
}
这个设置的原因是,对于每个练习,我允许用户(我,真的)选择哪一个来查看输出/交互,然后返回主循环以查看另一个(或退出)。 / p>
编辑2 除了我之外,这个代码运行时没有崩溃。如果社区需要,我将删除此问题并接受我的系统上存在无法解释的错误。我更倾向于帮助追踪可能导致它的原因(现在它只是一个cout&lt;&lt; setfill()问题,但如果由于某些潜在问题而导致未来崩溃怎么办&gt;)。但我知道有些错误是无法追查的。
我对绅士(或女人)感到有点困惑,绅士(或女士)立即声明问题不能与Code :: Blocks有关。该程序自动格式化所有正确的内置函数,除了 setfill()命令。这是使我的系统崩溃的setfill()命令。我不知道你可以用什么理由快速排除Code :: Blocks,但是由于我是新手,所以我不得不接受它。