当我定义一个字符串时,程序停止正常工作

时间:2018-01-01 18:08:50

标签: c++ string printing

我是编程新手,现在我正在学习Bjarne Stroustrup撰写的一本书(" 2014年编程原理和实践使用C ++")。无论如何,我遇到的问题是当我定义一个字符串时,程序停止正常工作。这是代码:

#include <iostream>

using namespace std;

int main() {
    double i;
    double c = 0;
    double bsf;
    double ssf;

    while (cin >> i) {
        if (c == 0) {
            bsf = i;
            cout <<"The largest so far: " << i<<endl;
        }
        if (c == 1 && i > bsf) {
              ssf = bsf;
            bsf = i;
            cout << "The largest so far: " << i<<endl;
        } else if (c > 0 && i > bsf) {
            bsf = i;
            cout <<"The largest so far: " << i<<endl;
        } else if (c > 0 && i < bsf) {
            if (i < ssf) {
                ssf = i;
                cout <<"The smallest so far: " << i <<endl;
            }
        }
        c++;
    }    
} 

在CodeBlocks中,这个程序正常工作(我希望程序允许我插入尽可能多的数字,并在我写出最大数字时指定我,还有最小数字(你可以从中做出更好的想法)当我尝试定义一个字符串时出现问题:

string um;

如果我这样做,程序不会识别写入的最小数字。例如,如果我写第一个数字220,它将被打印&#34;到目前为止最大:220&#34;,但是如果我在45之后写,它将不打印&#34;最小到目前为止:45&#34;。 如果你们能给我一些建议,那就太好了。

谢谢!

3 个答案:

答案 0 :(得分:2)

在你的程序中,你试图使用局部变量:

double bsf; // uninitialized local variable
double ssf; // uninitialized local variable

没有初始化它们因此导致undefined behaviour。在使用之前初始化(本地)变量:

double bsf = 0;
double ssf = 0;

实际的罪魁祸首是26

if (i < ssf) // UB access to uninitialized variable `ssf`

以下是Visual Studio的屏幕截图,其中包含重要信息:

UB 这是GCC version on Coliru

程序中没有std::string变量。如果有的话,您需要包含<string>标题。

答案 1 :(得分:2)

就我所见,答案并非未定义的行为。但完全没有满足OP要求的if子句。当输入第二个no时,c等于1,而在if子句中没有i <= bsf的代码。所以代码必须重写为

#include <iostream>

using namespace std;

int main() {
    double i;
    double c = 0;
    double bsf;
    double ssf;

    while (cin >> i) {
        if (c == 0) {
            bsf = i;
            cout <<"The largest so far: " << i <<endl;
        }
        if (c == 1 && i > bsf) {
            ssf = bsf;
            bsf = i;
            cout <<"The largest so far: " << i <<endl;
        } else if(c == 1 && i <= bsf) {
            ssf = i;
            cout <<"The smallest so far: " << i <<endl;
        }  else if (c > 0 && i > bsf) {
            bsf = i;
            cout <<"The largest so far: " <<i <<endl;
        } else if (c > 0 && i < bsf) {
            if (i < ssf) {
                ssf = i;
                cout << "The smallest so far: " << i <<endl;
            }
        }
        c++;
    }    
} 

这也将在@Ron的回答中遏制UB

编辑:谢谢@drescherjm我忘记添加&lt; =,已经更正了

答案 2 :(得分:1)

考虑初始值;如果您将bsf初始化为DBL_MIN并将ssf初始化为DBL_MAX,则此代码会变得更加简单。然后,当您完成循环时,您只需检查bsfssf的新值,而不会出现涉及c的所有混淆。