c++ - 如何正确使用getline

标签 c++ getline

我编写了一个使用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/

相关文章:

c++ - 使用 2 个线程的代码运行速度比使用 1 个线程慢 6 倍

c++ - 输入一个字母到 'int'

c++ - 每次迭代递增 i*2 并在 <n 时终止的 for 循环的大 O 是什么?

c++ - 试图阻止银行程序在选择交易后结束。 C++

c++: cin.getline 在一个单独的案例中被忽略

c++ - getline 的垃圾值

c++ - 纯虚拟 friend 类

c++ - 在 C++ 字符中存储 unicode

c++ - 如何使用字符串操作来获取输入文本文件的某些部分?

c++ - C++ 中的 Getline 函数将第一个输入作为空字符。它应该这样做吗?