使用“cin”在编程的第4章中使用“cin”获得不同的结果:使用C ++的原理和实践(Stroustrup)

时间:2015-04-10 12:28:43

标签: c++ c++11

我正在忙着编写第二版编程:使用C ++的原理和实践(Stroustrup),并且在读取值之间存在和没有空格的问题时会遇到问题,然后再次显示它们。

您能指出我正确的方向,以便找出结果不同的原因吗?

代码编译正常:c ++ -std = c ++ 11 -o 7 7.cpp

输入测试结果:

  • 10km(工程)
  • 10公里(工程)
  • 10厘米(工程)
  • 10厘米(不工作)

以下是代码以及一些具有不同结果的测试输入/输出。

#include "../../std_lib_facilities.h"

/*
Add a unit to each double entered; that is, enter values such as 10cm, 2.5in, 5ft, or 3.33m.
Accept the four units: cm, m, in, ft. Assume conversion factors 1m == 100cm, 1in ==
2.54cm, 1ft == 12in. Read the unit indicator into a string. You may consider 12 m (with a
space between the number and the unit) equivalent to 12m (without a space).
*/

int main()
{
    double value = 0.0;
    string unit = "";
    double largest_so_far = 0.0;
    double smallest_so_far = 0.0;
    char resp = 'y';


    // Conversions
    constexpr double m = 100.0;     // 1m = 100cm
    constexpr double in = 2.5;      // 1in = 2.54cm
    constexpr double ft = 12.0;     // 1ft = 12in

    cout << "\n\n\nGive me a floating point value and a unit (ex. 10 cm):   ";
    cin >> value >> unit;

    largest_so_far = value;
    smallest_so_far = value;
    cout << "\nYou gave me the following: " << value << " " << unit << '\n';
    cout << "Thank you.  The largest and smallest so far is now " << value << "\n\n";

    while (resp != '|') {
        cout << "\n\n\nGive me a floating point value:   ";
        cin >> value;

        if (value > largest_so_far)
        {
            largest_so_far = value;
            cout << "You gave me " << largest_so_far << ", the largest so far\n";
        }
        if (value < smallest_so_far) 
        {
            smallest_so_far = value;
            cout << "You gave me " << smallest_so_far << ", the smallest so far\n";
        }


        cout << "Another one? ('|' to stop, any other char for one more) :  ";
        cin >> resp;
    }
}

导致失败的值(例如“10cm”)最终会在程序中进入一个奇怪的循环。

  

输出:给我一个浮点值:另一个? ('|'停止,任何   另一个char更多):给我一个浮点值:另一个   一? ('|'停止,还有一个其他字符):给我一个浮动   点值:另一个? ('|'停止,还有一个其他字符):

然后我必须按CTRL-C退出。

一个较小的测试,多亏了MSalters ......

#include "../../std_lib_facilities.h"

/*
    Add a unit to each double entered; that is, enter values such as 10cm, 2.5in, 5ft, or 3.33m.
    Accept the four units: cm, m, in, ft. Assume conversion factors 1m == 100cm, 1in ==
    2.54cm, 1ft == 12in. Read the unit indicator into a string. You may consider 12 m (with a
    space between the number and the unit) equivalent to 12m (without a space).
*/

int main()
{
    double value = 0.0;
    string unit = "";

    cout << "\n\n\nGive me a floating point value and a unit (ex. 10 cm):   ";
    if (cin >> value >> unit)
        cout << "Success, got 2 values\n";
    else
        cout << "Failure!\n";

    cout << "\nYou gave me the following: " << value << " " << unit << '\n';

}

〜/ dev / cpp / ch4 / drill / ./test 给我一个浮点值和一个单位(例如10厘米):10厘米 失败! 你给了我以下内容:0

〜/ dev / cpp / ch4 / drill / ./test 给我一个浮点值和一个单位(例如10厘米):10公里 成功,得到2个值 你给了我以下:10公里

〜/ dev / cpp / ch4 / drill / ./test 给我一个浮点值和一个单位(例如10厘米):10公里 成功,得到2个值 你给了我以下:10公里

〜/ dev / cpp / ch4 / drill / ./test 给我一个浮点值和一个单位(例如10厘米):10厘米 成功,得到2个值 你给了我以下:10厘米

为什么只有字符串start from start小于“k”的字符才会失败?

2 个答案:

答案 0 :(得分:2)

输入操作可能会失败。它很容易测试:if(cin) /* All went right so far */if (!cin) /* something went wrong */

现在您的问题是,当出现问题时,您必须先清除故障状态,然后才能接受新输入:cin.clear()。此外,在您的代码中,您应该在尝试使用valueunit之前测试提取是否有效。

专业提示:您可以将其结合起来。

  if (cin >> value >> unit)
  {
     // Success - value and unit now hold the users input
  }
  else
  {
    // uh oh, that's not good
  }

答案 1 :(得分:2)

我也遇到过这个错误,所以我问了这个问题的重复版本,希望得到答案。这是我发现的:

  • 它似乎是clang使用的标准库之一的实际错误。这个确切错误的错误报告是linked here

  • 该错误似乎与转换说明符有关,这可以解释为什么只有一些字母而不是其他字母受其影响。可能是转换说明符的字母(例如,对于浮点数为10.0f)由库进行不同的解析,在这种情况下,它会影响cin正确拆分double和string的能力。

  • 已经2年了,这个错误仍未解决......

我使用-stdlib = libstdc ++重新编译了我自己同样有问题的代码,这是一个与默认libc ++库不同的库。它现在应该工作,虽然字母E仍然是不可接受的,因为它表示指数。

非常感谢stackoverflow用户Petesh找到这个问题的真正答案。