我想知道并理解为什么我的小控制台程序在运行之后就崩溃了,即使编译成功也是如此。
#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。 如果存在此异常的处理程序,则可以安全地继续该程序。
似乎问题与我的矢量有关,但我仍然没有得到它。 提前谢谢。
答案 0 :(得分:2)
if (unit != "cm" || unit != "m" || unit != "in" || unit != "ft") {
如果此if
表达式的计算结果为true,请注意执行路径不将新值插入valueWithUnit
向量。然后...
if (valueWithUnit[valueWithUnit.size() - 1] == "100cm") {
...如果这是循环的初始,第一次迭代,valueWithUnit
向量仍然为空,因为先前的if
语句跳过了将值插入{{ 1}}向量。
因此,valueWithUnit.size()将在此处返回零。你可以自己弄清楚这个bug的其余部分。
答案 1 :(得分:2)
您正在使用整数常量0初始化字符串,这会导致您的程序在声明unit
和convertNumb
时崩溃。
那是因为当它被传递给期望'\0'
的{{1}}构造函数时,整数值0(即string
)被视为空值指针值。参数(任何整数常量0都可以用作空指针值)。
将char const*
更改为std::string unit = '\0';
。 std::string unit;
也一样。
这会将其定义为空字符串。在c ++中使用字符串时,您不必担心空终止符。