好的家伙所以我正在学习C ++使用Bjarne Stroustrup的编程原理和练习使用C ++的书,其中一个演习要求我
第一步:输入一个数字后跟一个单位(允许cm,m,in和ft)
第二步:将该数字转换为米并输出
第三步:拒绝程序不知道如何转换的任何单位
第四步:拒绝没有单位的任何值
这是我到目前为止所做的:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
inline void keep_window_open() { char ch; cin>>ch; }
int main()
{
constexpr double cm_to_m = 100;
constexpr double cm_to_in = 2.54;
constexpr double in_to_ft = 12;
double i, in_meters;
string unit;
while (cin >> i)
{
cin >> unit;
if(unit == "cm" || unit == " cm") {in_meters = i / cm_to_m; cout << "That is " << in_meters << "m" << endl;}
else if(unit == "in" || unit == " in") {in_meters = i * cm_to_in / cm_to_m; cout << "That is " << in_meters << "m" << endl;}
else if(unit == "ft" || unit == " ft") {in_meters = (i * in_to_ft) * cm_to_in / cm_to_m; cout << "That is " << in_meters << "m" << endl;}
else if(unit == "m" || unit == " m") {cout << "That is " << i << "m" << endl;}
else if() cout << "You need to enter a unit after the number(cm, m, in, ft)" << endl;
else cout << "I don't know that unit" << endl;
}
}
我的问题出在第四步。我不能,为了我的生活,弄清楚如何检查数字后是否没有输入任何单位。我试过if(unit ==“”),以及类似的东西,但是当我输入一个数字时,它会一直持续到我输入一个单位。
如果你们可以帮助我们提供一些提示,这样我就可以自己弄清楚,这会有所帮助:)
TIA
答案 0 :(得分:0)
我想你可以等到\ n(行尾)并检查是否有单位
答案 1 :(得分:0)
首先,总是检查输入是否成功在尝试读取之后。为此,您需要检查流状态。通常,这与读取结合起来,例如:
if (std::cin >> unit) {
// ...
}
else {
// deal with no input being received
}
从它的外观来看,你想要约束单位相对于前一个值的位置:似乎你希望单位直接与该值相邻或者最多用一个空格分隔。 std::string
的输入运算符与所有行为良好的输入运算符一样,默认情况下以跳过前导空格开始。如果您不想允许任意空格,则需要明确测试。
当您想要允许最多一个空格字符时,您需要明确地处理它。为此,您需要peek()
下一个字符,如果是空格(' '
),则ignore()
它。接下来,您可以禁用在下一个字符处使用std::noskipws
或peek()
跳过前导空格,如果是空白字符(std::isspace()
)则会失败。下一步是阅读unit
。
也就是说,在值之后立即读取单位:
if (std::cin.peek() == ' ') {
std::cin.ignore();
}
if (std:cin >> std::noskipws >> unit >> std::skipws) {
// see if unit is a valid unit
}
else {
// no unit was entered where expected
}
unit
变量不会包含空格字符,除非您以不同的方式阅读字符串,例如使用std::getline()
。因此,您只需检查unit
对"cm"
,"in"
等等。没有必要对" cm"
进行检查,因为此测试将始终失败。< / p>
此外,我还会删除代码中的if ()
:除了添加混淆之外,它没有用处。我甚至不确定它是否合法。 gcc和clang都拒绝编译包含空if
语句的代码。
最后,我不是keep_window_open()
而是等待使用std::cin.ignore();
进行输入。如果您坚持保留此功能,其实现仍可简化为std::cin.ignore();
。