我正在阅读C++ Primer一书并尝试所有代码示例.我对这个很感兴趣:
#include <iostream>
#include <string>
using std::string;
using std::cin;
using std::cout;
using std::endl;
int main()
{
string line;
while (getline(cin,line))
cout << line << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译这段代码之前,我猜测编译会失败,因为我没有使用
while (std::getline(cin,line))
Run Code Online (Sandbox Code Playgroud)
为什么getline在全局命名空间中?据我所知,这应该只在我使用时发生
namespace std;
Run Code Online (Sandbox Code Playgroud)
要么
using std::getline;
Run Code Online (Sandbox Code Playgroud)
我在Linux Mint Debian Edition上使用g ++版本4.8.2.
我正在阅读C++入门书,并对以下代码示例感到好奇:
string buf;
while (cin >> buf && !buf.empty()) {
if (buf[0] != '_')
continue; // get another input
//the input starts with an underscore; process buf . . .
}
Run Code Online (Sandbox Code Playgroud)
循环应忽略不以下划线开头的单词,并对以下划线开头的单词执行某些操作.
我的问题是关于这个条件
(cin >> buf && !buf.empty())
Run Code Online (Sandbox Code Playgroud)
我会说条件(!buf.empty())在(cin >> buf)为真时总是为真,所以我没有看到添加它的意义.有没有第二个条件不冗余的情况?
关于类似构造的堆栈溢出有一个先前的问题(是否可以从cin读取空字符串并且仍然从cin.good()得到真实?)其答案根本就是否定(第二个条件是多余的).
如果这是正确的,为什么它在书上?这只是一个错误?还是有一些特殊的情况,双重条件是否有意义?
关于标准io的练习要求我:
读取标准输入的输入并将其写入标准输出.
可能的解决方案是:
#include<iostream>
#include<string>
using std::cin; using std::cout;
using std::string;
int main()
{
string word;
while (cin >> word)
cout << word;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,字符串充当缓冲区.如果有人试图通过执行以下操作来摆脱缓冲区:
#include<iostream>
using std::cin; using std::cout;
int main()
{
while (cout << cin)
;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果非常不同.当我运行这段代码时,我得到一个无休止的流
0x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d300x600d30
在终端上.
为什么会这样?为什么这些程序的行为有所不同?