在c++中,getline()不是读取字符串的所有字母,而是一个接一个地接受多个字符串

In c++ getline() is not reading all the letters of the string while accepting multiple strings one after the other

本文关键字:一个 字符串 getline c++ 读取      更新时间:2023-10-16
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t; //Number of test cases
while(t--){
cin.ignore();
string s;
getline(cin,s);
cout<<s<<endl;
}
return 0;
}

输入:

2
AMbuj verma
Aaaa bBBB
Bm Chetan

输出:

AMbuj verma
aaa bBBB
m Chetan

上面的程序没有读取字符串的第一个字符。

这就是我得到的输出。

我也使用过cin.ignore()

您需要做的是将cin.ignore()带到while循环之外,因为每次循环工作时,它都会占用字符串的第一个字母。

cin>>t; //Number of test cases
cin.ignore();
while(t--){
string s,a;
getline(cin,s);
cout<<s<<endl;
}

最后,为什么在代码中没有使用string a的情况下编写string s, a

您在循环中调用cin.ignore();,因此它将在每次迭代中忽略一个字符。由于您只使用operator >>一次,因此需要将对ignore的调用移出循环,并在输入之后进行调用。

cin>>t; //Number of test cases
cin.ignore(); // get rid of newline
while(t--){
string s,a;
getline(cin,s);
cout<<s<<endl;
}

实际上是的,cin.ignore()会消耗您的字符。现在要详细添加一些内容,输入基本上存储在缓冲区中(而不是在重定向的情况下)。现在,当您使用getline时,它会执行此操作。

(1) istream& getline (istream& is, string& str, char delim);
(2) istream& getline (istream& is, string& str);<--you used this

is中提取字符并将其存储到str[getline(cin.str)]中,直到找到定界字符delim(或换行符'\n',对于(2))。

如果在is中到达文件末尾,或者如果在输入操作期间发生一些其他错误。

如果找到分隔符,则提取并丢弃(即未存储,并且下一个输入操作将在其之后开始)。

所以当基本上ngetline自身消耗和丢弃时。现在您使用cin.ignore()

istream&忽略(streamsize n=1,int delim=EOF);摘录和丢弃字符从输入序列中提取字符丢弃它们,直到提取了n个字符或一个比较起来等于delim。

所以您没有指定任何内容,所以它会丢弃缓冲区中可用的一个字符,即第一个字符。(但你以为会有n被消耗,但它不在那里,因为它被getline()丢弃了。

这就是你如何得到这样的输出。

相关文章: