我正在使用getline而忽略但有些东西无法正常工作, 下面的示例代码无法理解它是如何工作的。
int main()
{
string str;
int t,length;
cin>>t; // t is the number of test cases
while(t--!=0)
{
cin.ignore();
getline(cin,str);
length=str.size();
cout<<"length="<<length;
}
}
示例输出:
2
hey hi
length 6
hey hi
length 5
为什么长度会减少?这是因为getline和ignore函数吗?任何帮助将不胜感激。
答案 0 :(得分:1)
它给出不同长度的原因是因为你的ignore()
函数只忽略一个字符。第一次它忽略输入数字后按下的return
键。但std::getline()
会删除return
字符。因此,第二轮ignore()
删除字符串的第一个字母,使其成为"eh hi"
。
int main()
{
string str;
int t, length;
cin >> t; // does not remove the RETURN character
while(t-- != 0)
{
// first removed RETURN character after removes first letter
cin.ignore();
getline(cin, str);
length = str.size();
cout << "length = " << length;
}
}
请尝试使用此功能:
int main()
{
string str;
int t, length;
cin >> t; // does not remove the RETURN character
while(t-- != 0)
{
// cin.ignore(); // dont do this here please
// cin >> ws skips all whitespace characters
// including the return character
getline(cin >> ws, str);
length = str.size();
cout << " length = " << length;
}
}
或者(可能更好)您可以将ignore()
函数移出循环到真正需要的地方:
#include <limits>
int main()
{
string str;
int t, length;
cin >> t; // does not remove the RETURN character
// ignore as many characters as necessary including the return
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
while(t-- != 0)
{
// cin.ignore(); // not here
getline(cin, str);
length = str.size();
cout << " length = " << length;
}
}
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
看起来很复杂,但这是保证删除任何虚假字符(如空格)的唯一方法。如果你愿意的话,你可以只用cin.ignore()
来完成练习。
答案 1 :(得分:0)
cin.ignore()
默认忽略一个字符。
如果每次输出字符串,您会看到在以后的情况下字符串等于“ey hi”。 h正在被丢弃。
cin
所持有的字符串的值在传递给getline之前会丢弃其第一个字符。
由于您使用的是getline,因此您只需从循环中移除cin.ignore()
,您的程序就可以正常运行。
但是,您还应该更改cin>>t;
行。在这种情况下,ignore()
在输入值2
之后删除换行符。此处stringstream
允许使用getline(...)
功能,或者您可以使用cin.ignore(str.max_size(), '\n');
。
对于stringstream
,您的代码将变为:
#include <sstream> // stringstream
#include <string> // std::string
#include <iostream> // cin
int main()
{
string str;
int t,length;
getline(cin, str);
std::stringstream stream;
stream << str;
if (!(stream >> t)) {
// Couldn't process to int
}
// cin>>t; // t is the number of test cases
// No longer need this line.
while(t--!=0)
{
// cin.ignore(); Drop this too
getline(cin,str);
length=str.size();
cout<<"length="<<length;
}
}
答案 2 :(得分:0)
如果您对空格不感兴趣,
然后使用getline(cin >> ws, str)