<iostream>
#include <iostream>

cin:

>> 运算符会根据变量类型自动解析,但它会跳过空格、制表符和换行符

如果你在读取包含空格的字符串,不用 cin >> str; 可以用 getline(cin,str);

cout:

自带缓冲的

意味着为了效率,系统可能不会立即把输出内容打印到屏幕上,而是等缓冲区满了或者是遇到了 endl / flush 时才一次性输出打印

cerr:

没有缓冲区

程序崩溃时, cerr 中的内容通常也能立即显示在屏幕上

在调试和报告严重故障时可以优先考虑使用

clog:

带缓冲区

适合记录大量运行信息

因为缓冲,性能比 cerr 高,但不能保证程序异常退出时能够立刻看见最后几条日志

总结:

普通输出:用 cout

报错信息:用 cerr(因为它最快显示,不排队)

打日志:用 clog

补充:

在默认情况下,cin 和 cout 是绑定( tie )在一起的

意味着每次执行 cin 之前,程序都会自动刷新 cout 的缓冲区,确保在输入前能看到提示语

因此:

ios::sync_with_stdio(false); cin.tie(nullptr);

上述这两行代码作用:在做算法竞赛或处理大量数据时,可以使用以下代码加速

第一行:取消与 Cstdio 的同步

第二行:解除 cin 和 cout 的绑定

endl 和 \n:

两者在 C++ 中都能表示换行,但也有区别:

endl 输出换行并强制刷新缓冲区

\n 仅输出换行,不触发刷新

因此:在频繁输出换行时,尽量用 \n ,这样能够减少刷新时间,否则会极大降低程序运行速度

getline()

cin.getline(char* buffer,streamsize count, char delim); //buffer: 指向字符数组的指针(即你要把数据存到哪) //count: 读取的最大字符数(包括最后的空字符 \0) //delim (可选): 停止读取的分隔符,默认为 \n

注意:

固定长度,超过长度会报错/截断

如果输入长度 >size,会触发错误状态位:(了解即可)

比如 遇到 \n :流状态如果一切正常的话, cin.good() 为真,这样就可以继续读取下一行

到达文件末尾 EOF :流状态会设置为 eofbit

当在循环里写 while(getline(cin,str)),因为流已经认为 没东西可以读取了,于是此时循环会终止

储存空间耗尽的时候 :流状态会设置为 failbit,

注意:如果 failbit 响应的话,除非调用 cin.clear(),否则在后面的所有的输入操作(包括 cin >> 或者是 另外一个 getline )都会直接跳过,不会执行

EG:

#include <iostream> using namespace std; int main() { char name[20]; cout << "请输入你的名字: "; // 最多读取 19 个字符,留下 1 个位置给结束符 '\0' cin.getline(name, 20); cout << "你好, " << name << endl; return 0; }