我编写了一个使用getline()
函数的程序,但我不知道应该如何以正确的方式使用getline()
。我在互联网上搜索过它,但我只是发现了一些关于将 getchar()
与 getline()
或 cin.ignore()
一起使用的信息.我试过了,但没有一个起作用,我不知道问题是什么,也不知道为什么 getline()
函数需要 getchar()
或 cin.ignore()
正常工作?
我的意见
2
Alderaan
1000.00 2000.00 3000.00
Dantooine
-1000.00 1000.00 1000.00
Circarpous Major
-500.00 500.00 -500.00
Y’Toub
-500.00 -500.00 500.00
这是我的代码:
#include <cmath>
#include <string>
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
long long int x, y, z, x1, y1, z1;
int n;
cin >> n;
string s, p;
while (n--)
{
getline(cin, s);
cin >> x;
cin >> y;
cin >> z;
cin.ignore();
getline(cin, p);
cin >> x1;
cin >> y1;
cin >> z1;
cin.ignore();
printf("%s to %s: %.2f\n", s.c_str(), p.c_str(), sqrt(pow(x - x1, 2) + pow(y - y1, 2) + pow(z - z1, 2)));
}
}
最佳答案
该代码将格式化输入(即使用 >>>
运算符进行输入)与未格式化输入(在本例中使用 std::getline()
)混合在一起。未格式化的输入不会跳过前导空格,而格式化输入会跳过前导空格。在这两种情况下,只要输入的下一个字符不符合格式,读取就会停止。
例如,当输入为 3000.00\n...
时读取 double
在读取最后一个 0
后停止,因为 '\n
不符合 double
的格式。因此,流中的下一个字符是 \n
。函数 std::getline()
一直读取,直到它找到第一个 \n
立即:它提取一个字符并 [成功] 产生一个空行。对于您的输入序列 Dantooine
是下一个但不符合 double
的格式并且流进入失败状态。
简单的解决方法是在从格式化输入切换到未格式化输入时始终跳过前导空格,例如,使用 std::ws
操纵器:
std::getline(std::cin >> std::ws, s);
这是否合适在一定程度上取决于您要阅读的内容。如果要读取的字符串可以以空格开头,则需要更加小心,例如,只提取下一个换行符之前的空格:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
(仅忽略一个字符可能不起作用,例如,如果该行的输入以 3000.00\n
结尾)。
将 3000.00
读取为 long
实际上在 .
处停止,即,对程序的第一个更改是更正读取的值的类型是 double
而不是 long
。请注意,您还应该始终在处理输入之前检查您的输入是否成功。也就是说,我实际上会使用这样的东西:
double x0, y0, z0, x1, y1, z1;
std::string l0, l1;
while (0 < n--
&& std::getline(std::cin >> std::ws, l0)
&& std::cin >> x0 >> y0 >> z0
&& std::getline(std::cin >> std::ws, l1)
&& std::cin >> x1 >> y1 >> z1) {
// do something with the input
}
关于c++ - 如何正确使用getline,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21500292/