我正在编写一个代码,在一行中接受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。