C ++ setfill()崩溃

时间:2014-05-11 20:06:10

标签: c++ crash codeblocks borland-c++

我很抱歉,如果之前已经解决了这个问题,但经过几个小时的搜索,我什么也没想到。我在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,但是由于我是新手,所以我不得不接受它。

0 个答案:

没有答案