无法弄清楚如何检查是否输入了任何内容

时间:2015-12-10 20:16:49

标签: c++ unit-testing

好的家伙所以我正在学习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

2 个答案:

答案 0 :(得分:0)

我想你可以等到\ n(行尾)并检查是否有单位

答案 1 :(得分:0)

首先,总是检查输入是否成功尝试读取之后。为此,您需要检查流状态。通常,这与读取结合起来,例如:

if (std::cin >> unit) {
    // ...
}
else {
    // deal with no input being received
}

从它的外观来看,你想要约束单位相对于前一个值的位置:似乎你希望单位直接与该值相邻或者最多用一个空格分隔。 std::string的输入运算符与所有行为良好的输入运算符一样,默认情况下以跳过前导空格开始。如果您不想允许任意空格,则需要明确测试。

当您想要允许最多一个空格字符时,您需要明确地处理它。为此,您需要peek()下一个字符,如果是空格(' '),则ignore()它。接下来,您可以禁用在下一个字符处使用std::noskipwspeek()跳过前导空格,如果是空白字符(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 ():除了添加混淆之外,它没有用处。我甚至不确定它是否合法。 gccclang都拒绝编译包含空if语句的代码。

最后,我不是keep_window_open()而是等待使用std::cin.ignore();进行输入。如果您坚持保留此功能,其实现仍可简化为std::cin.ignore();