getline 无法正常工作?可能是啥原因? [复制]
Posted
技术标签:
【中文标题】getline 无法正常工作?可能是啥原因? [复制]【英文标题】:getline not working properly ? What could be the reasons? [duplicate]getline 无法正常工作?可能是什么原因? [复制] 【发布时间】:2011-10-02 18:04:13 【问题描述】:可能重复:getline not asking for input?
在我的程序中发生了一些独特的事情。 以下是一些命令集:
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "\nAge: "; // cin age
int age;
cin >> age ;
cout << "\nFather's Name: "; // cin father name
getline( cin , fatherName );
cout << "\nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
当我尝试将这个 sn-p 与整个代码一起运行时。输出程序的工作方式如下:
输出:
Enter the full name of student:
Age: 20
Father's Name:
Permanent Address: xyz
如果你注意到了,程序没有问我全名,而是直接问我年龄。然后它也跳过了父亲的名字,问了永久地址。 这可能是什么原因?
因为代码太大,我很难贴出整个代码。
【问题讨论】:
请将程序输出复制并粘贴到您帖子的格式化部分。图像具有随时间消失的特性,通常会产生红十字。 getline 无法正常工作? "select isn't broken" @Ulterior:哪些声明?int age
? getline
's,仅以std::string
为目标? cin
的?真的没有理由 -1。
【参考方案1】:
由于您尚未发布任何代码。我来猜一猜。
将getline
与cin
一起使用时的一个常见问题是getline
不会忽略前导空白字符。
如果在 cin >>
之后使用 getline,getline()
会将此换行符视为前导空格,并且它会停止继续读取。
如何解决?
在拨打getline()
之前先拨打cin.ignore()
或者
进行虚拟调用 getline()
以使用来自 cin >>
的尾随换行符
【讨论】:
+1 用于心理调试。ignore
的问题在于您不知道需要忽略多少。最好只使用getline
一次只读取一行输入。
或者怎么样: if (getline(cin >> ws, s2)) getline(cin, s2); 【参考方案2】:
问题是您将getline
与cin >>
输入混合在一起。
当您执行cin >> age;
时,它会从输入流中获取年龄,但会在流中留下空白。具体来说,它将在输入流上留下一个换行符,然后在下一个getline
调用中读取为空行。
解决方案是只使用getline
获取输入,然后解析该行以获得您需要的信息。
或者要修复您的代码,您可以执行以下操作,例如。 (您仍然需要自己添加错误检查代码):
cout << "Enter the full name of student: "; // cin name
getline( cin , fullName );
cout << "\nAge: "; // cin age
int age;
std::string line;
getline(cin, line);
std::istringstream ss(line);
ss >> age;
cout << "\nFather's Name: "; // cin father name
getline( cin , fatherName );
cout << "\nPermanent Address: "; // cin permanent address
getline( cin , permanentAddress );
【讨论】:
【参考方案3】:在cin >> age ;
行之后,输入缓冲区中仍有换行符\n
(因为您按下回车键输入值),要解决此问题,您在读取int 后添加一行cin.ignore();
。
【讨论】:
以上是关于getline 无法正常工作?可能是啥原因? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
打开excel后出现“很抱歉,您的office安装无法正常工作”的提示是啥原因?