Getline忽略输入的第一个字符

7

我刚开始学习C++中的数组,我遇到了一个问题,无法获取数组的第一个字符。

这是我的代码,

1- 我输入一个名字,比如 "Jim"

char name[30];
cin.ignore();
cin.getline(name, 30);

2- 我立即尝试输出数组

    cout<<"NAME:"<<name; // THIS PRINTS 'im'

我以为它会打印“J”,我错在哪里了?

刚开始学习时,你应该使用 std::stringstd::getline。它们会让你的生活变得更加轻松。而且,当你刚开始学习时,不必担心它们是如何工作的,但仍然要继续使用它们。 - chris
无论如何,你可能在没有需要忽略的情况下忽略了一个字符,因此它忽略了你新输入的第一个字母。 - chris
我意识到我根本没有得到第一个字符。这是为什么?我在其他地方有完全相同的代码,而且我的输入也是正确的。我不能使用std::getline,因为我在课堂上没有学过它,而且我必须将其作为一个项目提交。 - lisovaccaro
你可能有其他地方需要忽略的剩余输入。在使用 std::string 之前,什么样的类使用字符数组(或者请不要说你使用指针)? - chris
3个回答

13

这是cin.ignore的签名:

istream& ignore (streamsize n = 1, int delim = EOF);

如果您调用 ignore 函数时没有传递任何参数,它会默认忽略输入中的一个字符 '1'。在这种情况下,它忽略了 'J'。移除 ignore 调用,您将得到 'Jim'。


我看到了,但我不确定我理解为什么会发生这种情况。我在其他地方有完全相同的代码,并且使用ignore,它不会跳过第一个字符。 - lisovaccaro
@Liso22:在这段代码中,在调用getline之前,你是否有调用operator>>?例如:cin >> something;?请参考这个问题,了解为什么在那种情况下调用ignore是正确的,但在这种情况下不是。 - Benjamin Lindley

4

只需删除cin.ignore();

这会忽略第一个字符,因此您会错过 'J'。


0

我有一段代码,问题是在第一个循环之后它会吃掉第一个字符(第一个循环没问题)

do{
    cout << endl << "command:> ";
    string cmdStr1="";
    cin.ignore();
    getline(cin, cmdStr1);
    cout << "cin= " << cmdStr1 << endl; //For Debuging
    //...more code here
}while(1);

输出结果为:

命令:> pos

输入= pos

命令:> pos ... 从第二个循环开始删除第一个字符

输入= os

...

如果注释了 "cin.ignore();",则会导致 "segmentation fault" 错误:
命令:> cin=
分段错误
对我有效的解决方案是:
将 "cin.ignore();" 行移动到 do-while 循环之前。
cin.ignore();

      do{
            std::cout << endl << "command:> ";
            std::string cmdStr1="";
            std::getline(std::cin, cmdStr1);
            std::cout << "cin= " << cmdStr1 << endl; //For Debuging
            //...more code here
    }while(1);

输出结果为:

命令:> pos

输入= pos

命令:> pos

输入= pos

...

...

顺便说一句,把代码放在这里真的很难...我很失望,无法继续合作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接