如何正确使用getline

Dan*_*elV 2 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    
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

#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)));
    }
}
Run Code Online (Sandbox Code Playgroud)

Die*_*ühl 5

代码将格式化输入(即使用>>操作符输入)与未格式化输入(在本例中使用std::getline())混合.未格式化的输入并不会跳过前导空白,而格式化输入不跳过前导空白.在这两种情况下,只要输入是下一个字符,读取就会停止,这将不适合格式.

例如,在读取最后一个double输入3000.00\n...后停止读取,0因为' \n不符合doubles格式.因此,流中的下一个字符是a \n.函数std::getline()读取,直到它找到第一个\n立即:它提取一个字符并[成功]产生一个空行.在输入时,序列Dantooine是下一个但不符合a的格式,double并且流进入失败状态.

简单的解决方法是在从格式化输入切换到无格式输入时始终跳过前导空格,例如,使用std::ws操纵器:

std::getline(std::cin >> std::ws, s);
Run Code Online (Sandbox Code Playgroud)

这是否合适取决于您想要阅读的内容.如果您想要读取的字符串可以以空格开头,则需要更加小心,例如,只提取空格直到下一个换行符:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Run Code Online (Sandbox Code Playgroud)

(只是忽略一个字符可能不起作用,例如,如果该行的输入结束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
}
Run Code Online (Sandbox Code Playgroud)