我正在忙着编写第二版编程:使用C ++的原理和实践(Stroustrup),并且在读取值之间存在和没有空格的问题时会遇到问题,然后再次显示它们。
您能指出我正确的方向,以便找出结果不同的原因吗?
代码编译正常:c ++ -std = c ++ 11 -o 7 7.cpp
输入测试结果:
以下是代码以及一些具有不同结果的测试输入/输出。
#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”的字符才会失败?
答案 0 :(得分:2)
输入操作可能会失败。它很容易测试:if(cin) /* All went right so far */
或if (!cin) /* something went wrong */
。
现在您的问题是,当出现问题时,您必须先清除故障状态,然后才能接受新输入:cin.clear()
。此外,在您的代码中,您应该在尝试使用value
和unit
之前测试提取是否有效。
专业提示:您可以将其结合起来。
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找到这个问题的真正答案。