使用 >> 和 getline 的混合类型

Posted

技术标签:

【中文标题】使用 >> 和 getline 的混合类型【英文标题】:Using mixed type of >> and getline 【发布时间】:2014-05-16 04:56:14 【问题描述】:

我的任务是将字符串输入到 char 数组中。这就是它的样子:

char name[30];
cin>>name;
cin.getline(name,29);
cout<<name;

与输入一样:Ly Nguyen Khang 结果只返回Nguyen Khang 请任何人帮助我理解这有什么问题:(

我的部分代码:

#define INPUT_HELP_NAME "Please input name: "
#define INPUT_HELP_PHONE "Phone: "
    cout << INPUT_HELP_NAME;
        cin.getline(res->name, MAX_NAME_LENGTH-1);
        cout << INPUT_HELP_PHONE;
        cin >> res->phone;

当它运行时,它会显示如下内容:

Please input name : Phone : 

【问题讨论】:

你将Ly 写成namecin&gt;&gt;name;,然后你用cin.getline(name,29); 覆盖名称的其余部分 使用std::string 代替char 数组。 一般来说,混合基于行和基于字段的输入不能很好地协同工作。对于定期提示用户输入值的交互式程序,仅使用基于行的。然后,使用 stringstreams(或 lexical_cast)将整行转换为相应的值并检查错误。祝你好运! 其实老师要求我们用char作为知识的考验,后面还有几个cin,比如电话号码,生日...。这些也设置成char类型,我可以很容易使用 cin>> 来读取它们,但是函数 cin>> 的问题是它是否会停止它们之间的空格,所以它不可能使用 cin>> 作为名称。 char 数组的问题是operator&gt;&gt; 会愉快地写到数组末尾之外,从而导致所谓的缓冲区溢出。这是软件中许多漏洞的根源,没有任何借口可以教授这种粗心的编程。使用std::string 会自动调整字符串的大小。 【参考方案1】:

cin了两次,导致它无法工作。这是正确的做法:

char name[30];
cin.getline(name,29);
cout<<name;

cin.getline(name,29); 已经是 cined 它,因此不需要 cin&gt;&gt;name;ing 它,这会使您的结果发生变化,因为您的代码对 cin 它说了两次。

【讨论】:

啊是的,这实际上是我之前所做的,但是编译器跳过了输入并直接进入 cout,因为我读到了一些类似的帖子,他们说因为如果你把 getline 然后跟着通过 operator >> 或 @Khang:无论你读到什么,要么是错误的,要么是你误解了它。 Bob 的代码有效,假设 cin 事先没有处于错误状态,并且没有无法读取换行符或 EOF。您应该开始检查每个输入操作是否有效 - 否则 cerr &lt;&lt; "failure!\n" - 因此错误的流状态不会使正确的代码出现损坏。 编译器实际上跳过了它,而不仅仅是我的假设。我将把我的一部分代码放在上面的线程上。

以上是关于使用 >> 和 getline 的混合类型的主要内容,如果未能解决你的问题,请参考以下文章

混合cin和getline输入问题[重复]

即使我使用字符串空格,也使用 >> 和 getline 获取空输出

将混合数据文件读入 C++ 字符串

使用 `cin >> n;` 后使用 `getline(cin, s);`

用getline分割字符串

标准没有成员'getline'?