【问题标题】:Why is my little program crashing just after I run it为什么我的小程序在我运行后就崩溃了
【发布时间】:2016-01-31 03:44:04
【问题描述】:

我想知道并理解为什么我的小控制台程序在我运行它之后会崩溃,就在开始时,即使它编译成功。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::string> valueWithUnit;

    {
        std::string unit = '\0';
        std::string convertNumb = '\0';
        for (double forVal; std::cin >> forVal; ) {
            std::cin >> unit;

            if (unit != "cm" || unit != "m" || unit != "in" || unit != "ft") {
                std::cout << "The unit you entered is not supported by this program.";
                std::cout << " Try again with \"cm\", \"m\", \"in\", \"ft\"\n";
            }
            else {
                convertNumb = forVal;
                valueWithUnit.push_back(convertNumb + unit);

                if (valueWithUnit[valueWithUnit.size() - 1] == "100cm") {
                    std::cout << "That's also 1 meter.\n";
                }
                else if (valueWithUnit[valueWithUnit.size() - 1] == "2.54cm") {
                    std::cout << "That's also 1 inch.\n";
                }
                else if (valueWithUnit[valueWithUnit.size() - 1] == "1in") {
                    std::cout << "That's also 2.54 centimeters.\n";
                }
                else if (valueWithUnit[valueWithUnit.size() - 1] == "1ft") {
                    std::cout << "That's also 12 inches.\n";
                }
            }
        }
    }

    for (std::string i : valueWithUnit) {
        std::cout << i << std::endl;
    }

    system("pause");
    std::cin.ignore();
    std::cin.get();
    return 0;
}

当我调试它时,它告诉我:

Project1.exe 中 0x00191644 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。 如果有这个异常的处理程序,程序可以安全地继续。

似乎问题与我的矢量有关,但我仍然不明白。 提前致谢。

【问题讨论】:

  • 它可以让你输入长度和单位吗?您是否单步执行代码并查看异常发生在哪一行?
  • 如果您输入了一个无效的单位,程序将显示 UB。该向量将为空,然后将使用数组下标运算符[] 访问。是这样吗?
  • 不,它在我运行后立即崩溃。也找不到异常发生在哪一行。
  • 这不是问题,但不要使用std::endl,除非您需要它的额外功能。 '\n' 开始新的一行。

标签: c++ debugging crash


【解决方案1】:
if (unit != "cm" || unit != "m" || unit != "in" || unit != "ft") {

如果此if 表达式的计算结果为真,请注意执行路径不会将新值插入valueWithUnit 向量。那么……

if (valueWithUnit[valueWithUnit.size() - 1] == "100cm") {

...如果这是循环的初始迭代,valueWithUnit 向量仍将为空,因为之前的 if 语句跳过了将值插入到 valueWithUnit 向量中。

因此,valueWithUnit.size() 将在此处返回零。你可以自己解决这个错误的其余部分。

【讨论】:

  • 我更正了代码。应该就像现在的问题一样,如果单元检查被评估为假,所有其他 if 都应该在启用的 else 中。但是仍然有错误,所以问题仍然存在。
  • 当你应该使用&amp;&amp;时,你也在使用||。您没有使用调试器单步执行程序吗?
  • 我通常仍然对 && 和 || 感到困惑但我总是意识到,在我尝试使用我的程序之后啊啊。感谢您的提示。
【解决方案2】:

您正在使用整数常量 0 初始化字符串,这会导致您的程序在您声明 unitconvertNumb 时崩溃。

这是因为整数值 0(即 '\0')在传递给需要 char const* 参数的 string 构造函数时被视为空指针值(任何整数常量 0 都可以用作空指针值) .

std::string unit = '\0'; 更改为std::string unit;convertNumb 也是如此。

这会将其定义为空字符串。在 c++ 中使用字符串时,您不必担心空终止符。

【讨论】:

  • 嗯,我在互联网上的某个地方了解到 '\0' 是一个很好的初始化方法,但似乎不是。它实际上起作用了@puqeko,我还认为仅仅因为我初始化为NULL而发生崩溃会很奇怪,但看起来确实如此。谢谢 ;) 必须再次对初始化进行一些研究,啊。 PS:由于声誉低,无法投票给您:c
  • @puqeko:我的错误——我把它误读为"\0"(这是有效的),而不是'\0',这不是(因为它实际上只是0,即一个NULL指针) .你是绝对正确的! (最好的代码仍然是简单的std::string unit;)。
  • @b1GZZ:这是一种很好的 C 字符串初始化方法(即指向char 的指针),但您没有使用 C 字符串。
  • 附带说明:string 是一个类,而不是像 char 这样的类型。这就是它表现不同的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2015-04-27
  • 2010-09-30
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多