我觉得有很多类似的问题,所以如果这是重复的话,我真的很抱歉.但是,我无法找到这个具体问题的答案.
当cin被传递给它时,我很困惑getline是如何工作的,因为我的理解是它应该在每次调用时调用cin.使用我正在阅读的书中的代码时,getline被调用几次,但只发送一个输入.除了在这些getline调用中之外,不会从任何地方调用cin对象.
这里发生了什么?当达到getline时,程序是否只是停在其轨道上并等待输入流传递包含所需分隔符的值?如果是这种情况,那么后续的getline调用是否必须等待,因为输入流已经有包含各自分隔符的数据?我跑了几个测试表明可能就是这种情况.
这是代码:
string firstName;
getline(cin,firstName,',');
string lastName;
getline(cin,lastName,',');
string job;
getline(cin,job,'\n');
cout<<firstName<<" "<<lastName<<" is a "<<job<<endl;;
Run Code Online (Sandbox Code Playgroud)
如果这是一个愚蠢的问题再次抱歉,但我环顾四周,真的找不到答案.提前感谢您提供的任何帮助!
澄清:
此代码为控制台输入"First,Last,Job \n"输出"First Last is a Job"
对函数的调用cin实际上不是对用户输入的请求(至少不是直接).它是对标准输入字符的请求.在正常的程序操作中(标准输入不是从文件或其他源引导的),标准输入存储在缓冲区中.如果标准输入缓冲区为空,并且cin正在请求更多字符,则系统将通过终端请求用户输入.(即键盘).终端请求的这个输入通常是面向行的.也就是说,它等待您按下Enter键,然后发送所有数据以存储在标准输入缓冲区中.如果cin在输入缓冲区为空之前获取所需的所有字符,那么这些字符将一直保留到下一个请求.
因此,例如,当您拨打此电话时:
getline(cin,firstName,',');
Run Code Online (Sandbox Code Playgroud)
并且输入缓冲区为空,假设用户输入:
Benjamin,Lindley,软件开发人员Enter
首先,以下字符串存储在输入缓冲区中:
"Benjamin, Lindley, Software Developer\n"
Run Code Online (Sandbox Code Playgroud)
然后getline导致"Benjamin,"从输入缓冲区读取(但丢弃逗号).
" Lindley, Software Developer\n"
Run Code Online (Sandbox Code Playgroud)
保留在缓冲区中以便将来进行任何操作cin.