调试错误!Abort()已被调用.Visual Studio中的错误



我正在编写一个代码,在一行中接受4个值(值是直角三角形中一个顶点的x,y坐标和同一三角形中另一个顶点的x,y坐标)然后代码使用atan2()函数计算deltaX和deltaY、斜边的长度以及第二个点和第一个点之间的夹角。

则代码以如下方式输出/显示斜边:斜边长度(float)+单间距+点间夹角

代码应该在同一个控制台中多次运行:运行方式

但是在我运行代码一次并按enter键再次运行它之后,它抛出一个错误,说abort()已被调用,请帮助!它的运行方式和错误

代码是:

// Copyright A.T. Chamillard. All Rights Reserved.
#define _USE_MATH_DEFINES
#include <iostream>
#include <string>
#include <cmath>
// IMPORTANT: Only add code in the section
// indicated below. The code I've provided
// makes your solution work with the 
// automated grader on Coursera
// x and y coordinates for points
float Point1X;
float Point1Y;
float Point2X;
float Point2Y;
void GetInputValuesFromString(std::string Input);
/**
* Programming Assignment 2
* @return exit status
*/
int main()
{
// loop while there's more input
std::string Input;
std::getline(std::cin, Input);
while (Input[0] != 'q')
{
// extract point coordinates from string
GetInputValuesFromString(Input);
// Add your code between this comment
// and the comment below. You can of
// course add more space between the
// comments as needed
`
float deltaX{ Point2X - Point1X };
float deltaY{ Point2Y - Point1Y };
float hypo{ sqrtf(powf(deltaX, 2)+powf(deltaY, 2) )};
float a{ atan2((Point2Y-Point1Y),(Point2X-Point1X)) };
a = a * 180 / M_PI;
std::cout << hypo << " " << a;
`
// Don't add or modify any code below
// this comment
std::getline(std::cin, Input);
}
}
/**
* Extracts point coordinates from the given input string
* @param Input input string
*/
void GetInputValuesFromString(std::string Input)
{
// extract point 1 x
int SpaceIndex = Input.find(' ');
Point1X = std::stof(Input.substr(0, SpaceIndex));
// move along string and extract point 1 y
Input = Input.substr(SpaceIndex + 1);
SpaceIndex = Input.find(' ');
Point1Y = std::stof(Input.substr(0, SpaceIndex));
// move along string and extract point 2 x
Input = Input.substr(SpaceIndex + 1);
SpaceIndex = Input.find(' ');
Point2X = std::stof(Input.substr(0, SpaceIndex));
// point 2 y is the rest of the string
Input = Input.substr(SpaceIndex + 1);
Point2Y = std::stof(Input);
}

我试着用谷歌搜索,但我没有得到我要找的

我运行你的代码没有问题,所以这是一种猜测。

你的代码唯一的问题是这个
std::cout << hypo << " " << a;

实际上应该是

std::cout << hypo << " " << a << "n";

即在输出两个数字后输出一个换行符。

现在我的猜测是,在第一组结果之后,由于代码中缺少换行符的输出,在键入第二组数字之前,您按下enter键将光标移动到下一行。这足以使您的程序崩溃。发生崩溃是因为在没有输入的情况下按enter键导致getline读取空白行。然后GetInputValuesFromString将尝试从空白行读取四个数字,因为该函数没有设计用于处理这种情况,它崩溃了。

另一种说法是,真正的问题不在于你的代码,而在于写得不好的函数GetInputValuesFromString。任何处理用户输入的函数都应该验证该输入。但是那个函数不是你写的,所以不能指望你去修复它。

简单的解决方案是在输入第二组数字之前不要键入回车键(并修改代码以便输出换行符)。

正如我所说的只是猜测,但我希望我猜对了。这是一个很好的教训,计算机程序完全按照你的吩咐去做,不管那是多么愚蠢或出乎意料。

重新阅读你上面写的'按enter键再运行一次'。这似乎正是问题所在。

必须检查SpaceIndex的值,参见std::string::find

返回值

找到的子字符串的第一个字符的位置,如果没有找到,则为npos。

int SpaceIndex = Input.find(' ');

使用SpaceIndex(std::string::npos)调用std::string::substr将给出一个异常或空字符串。

如果substr产生一个空字符串,对std::stof的调用将异常失败,因为不可能进行转换

异常

std::invalid_argument

std::out_of_range,如果转换后的值超出结果类型的范围,或者底层函数(strtof、strtod或strtold)将errno设置为ERANGE。

相关内容

  • 没有找到相关文章

最新更新