使用getline减少字符串长度?

时间:2014-10-05 16:41:36

标签: c++ getline

我正在使用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函数吗?任何帮助将不胜感激。

3 个答案:

答案 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()来完成练习。

阅读std::istream::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)