0

每次这个函数的输入类型有错误时,它会自动将*_cost的值设置为0。为什么会这样?

void Item::setCost(string input){
float entered;
istringstream stin;
stin.str(input);
if(!(stin >> entered)){
    do{
        cout << "invalid input" << endl;
        stin.clear();
        getline(cin, input);
        stin.str(input);
        *_cost = entered;
    }
    while(!(stin >> entered));
}
else{
    *_cost = entered;
}
}

我在我的主要功能中使用该功能如下:

istringstream stin;
string input;

cout << "enter cost" << endl;
getline(cin, input);
items[i]->setCost(input);
4

3 回答 3

1

由于 if 语句,您正在设置*_cost一个值,该值总是必然是不正确的值。
*_cost = entered行仅在程序通过其“无效输入”代码时才会执行。程序仅在输入不是合法值时打印“无效输入”。因此 _cost 只能设置为非法值。
要解决您的问题,请*_cost = entered在 do-while 循环之后放置。

我不确定您为什么不只是使用 std::cin 直接读取数据,而不是将标准输入转换为 std::string 的实例,然后再转换为 istringstream。

于 2013-10-29T03:30:33.287 回答
1

您需要将第一个*_cost = entered移出do .. while块以成为它之后的第一个语句。完成此操作后,您将看到进一步的重构很有帮助,尽管不是必需的。

while(!(stin >> entered))
{
    cout << "invalid input" << endl;
    stin.clear();
    getline(cin, input);
    stin.str(input);
}
*_cost = entered;
于 2013-10-29T03:34:52.057 回答
0

*_cost = entered;在您的代码中执行时,entered无效。

我刚刚按照您的初衷更正了您的代码

bool Item::setCost(string input) {
    bool ret_val = true;
    float entered = 0.0;
    istringstream stin;
    stin.str(input);

    while ( !(stin >> entered) ) {  // loop till you read a valid input 
        if ( !stin.rdbuf()->in_avail() ) {
            ret_val = false;
            break;
        }
    }

    *_cost = entered;
    return ret_val;
}

stin.rdbuf()->in_avail()可用于获取准备从字符串流中读取的可用字符的计数,您可以使用它来检查您的字符串流是否为“空”。

例如,如果您想从 istringstream 中提取一个浮点数,但您得到其他东西(失败条件),然后查看是否有任何剩余字符(即数字),您可以检查 if stin.rdbuf()->in_avail() == 0.

于 2013-10-29T03:25:09.463 回答