C++ 如何正确使用getline

C++ 如何正确使用getline,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

我编写了一个使用
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;
int main()
{
长整型x,y,z,x1,y1,z1;
int n;
cin>>n;
字符串s,p;
而(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到%s:%.2f\n”,s.c_str(),p.c_str(),sqrt(pow(x-x1,2)+pow(y-y1,2)+pow(z-z1,2));
}
}

cin>>z
不使用
\n
字符。因此,您需要一个
cin.ignore()
来使用换行符并使下一个
getline()
读取您想要的行。同样的问题也发生在z1上,代码混合了格式化输入(即使用
>
运算符进行输入)和未格式化输入(在本例中使用
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');

最好不要混合使用令牌和行提取。如果您想标记一行,只需使用字符串流。我想试试这个:

#include <string>
#include <sstream>
#include <iostream>

std::string n_str;   // for the first number, parse it later

if (!std::getline(std::cin, n_str))
{
    // error, die
}

for (std::string name, numbers;
     std::getline(std::cin, name) && std::getline(std::cin, numbers); )
{
    std::istringstream iss(numbers);
    double x, y, z;
    if (!(iss >> x >> y >> z >> std::ws) || iss.get() != EOF)
    {
        // parse error, die
    }

    // "name", "x", "y", "z" are usable now
}
#包括
#包括
#包括
std::string n_str;//对于第一个数字,请稍后对其进行解析
如果(!std::getline(std::cin,n_str))
{
//错误,死亡
}
对于(std::字符串名称,数字;
std::getline(std::cin,name)和&std::getline(std::cin,number);)
{
std::istringstream iss(编号);
双x,y,z;
如果(!(iss>>x>>y>>z>>std::ws)| | iss.get()!=EOF)
{
//解析错误,死
}
//“名称”、“x”、“y”、“z”现在可用
}
试试看

#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--)
    {
        cin.ignore();
        cin.clear();
        getline(cin, s);
        cin >> x;
        cin >> y;
        cin >> z;
        cin.ignore();
        cin.clear();
        getline(cin, p);
        cin >> x1;
        cin >> y1;
        cin >> z1;
        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;
int main()
{
长整型x,y,z,x1,y1,z1;
int n;
cin>>n;
字符串s,p;
而(n--)
{
cin.ignore();
cin.clear();
getline(cin,s),;
cin>>x;
cin>>y;
cin>>z;
cin.ignore();
cin.clear();
getline(cin,p);
cin>>x1;
cin>>y1;
cin>>z1;
printf(“%s到%s:%.2f\n”,s.c_str(),p.c_str(),sqrt(pow(x-x1,2)+pow(y-y1,2)+pow(z-z1,2));
}
}

第一次输入字符串时有两次。

当您说
std::getline()
不正确时,您的确切意思是什么?我很确定
std::getline()
工作正常!但是,请注意,您始终需要检查输入操作是否成功。另外,你的问题(我想我知道你的问题是什么)实际上已经被回答了无数次了!(提示:您正在混合格式化和未格式化的输入)当然,它可以正常工作,但我不知道如何使用它,这个函数是否需要其他函数,如getchar()来工作???好吧,关于找到解决方案,需要了解的一件事是准确地描述问题所在!你说它不起作用,但没有说明效果和你的预期。声明输入也不能真正描述什么不起作用。@Dietmar Kühl很抱歉我编辑了我的问题,到目前为止,仍然没有描述。这里有一些无关的内容提到了你试图做些什么来解决这个问题(“我在网上搜索它…”),一些代码和一些输入。您没有说明该程序打算做什么,也没有说明它是如何失败的。是的,我知道它是如何失败的以及为什么失败的(当读取上面的输入时,第二个字符串是空的,值停止更改),但这并不能让你解决下一个问题。@Dornhee:老师有点“邪恶”:如果你仔细看输入,例如。,通过编辑答案并将光标移到行尾,您将看到换行符前有尾随空格!这实际上很好,因为老师强迫学生使用正确的方法跳过空白!请注意,此代码也不起作用,因为发布的输入实际上在最后一位数字和换行符之间包含多个空格!你需要跳过所有这些。你的答案很好,但当我把它放在代码中时,我仍然无法得到真正的结果。为什么???@Danial:我没有看到你读的是
long
而不是
double
。因为您没有描述问题(“它读取第一个
s
x
#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--)
    {
        cin.ignore();
        cin.clear();
        getline(cin, s);
        cin >> x;
        cin >> y;
        cin >> z;
        cin.ignore();
        cin.clear();
        getline(cin, p);
        cin >> x1;
        cin >> y1;
        cin >> z1;
        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)));
    }
}