前言
C++ 提供了多种输入输出方式,本章节重点讲解常用函数及流操作。
一、getchar 和 putchar
getchar() 和 putchar() 属于 C 语言库函数,常用于字符级别的读写。
1、getchar()(读取)
功能 返回用户从键盘输入的一个字符,不带参数。程序运行至此暂停,等待输入,等同于使用 cin 或 scanf() 方法读取一个字符。
头文件
#include<cstdio>
返回值 如果读取失败,返回常量 EOF(通常为 -1),因此返回值类型应设为 int 而非 char。读取成功返回字符的 ASCII 值。
读取方式 getchar() 不会忽略开头的空白字符,总是返回当前读取的第一个字符,无论是否为空格。
注意
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int ch;
ch = getchar();
cout << (char)ch << endl;
return 0;
}
输出时需以字符形式输出,因为读取成功返回字符的 ASCII 值,否则将输出该字符的 ASCII 码数值。
2、putchar()(输出)
功能及读取方式 参数为 int character。读取 ASCII 码,输出对应的字符。如果 character 本身就是字符,则直接输出。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
char c = 'b';
putchar(55); // 传入常量,输出'7'(ASCII 码 55)
putchar(c); // 传入字符变量,输出'b'
putchar('5'); // 传入字符'5'(ASCII 码 53),输出字符'5'
return 0;
}
头文件
同 getchar,包含 <cstdio>。
返回值 操作成功时,putchar() 返回输出的字符,否则返回常量 EOF。
3、结合
可以将这两个函数结合起来,一个读取一个输出。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
char c;
c = getchar();
putchar(c);
return 0;
}
或者循环读取,读取一个字符输出一个:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int c;
while((c = getchar()) != EOF){
putchar(c);
}
return 0;
}
二、scanf 和 printf 及占位符
用法与 C 语言一致,此处不再赘述。
三、cin 和 cout
cin 和 cout 是 C++ 的流对象,输入输出十分方便,不需要手动控制格式,能够自动识别变量类型。数据在键盘输入和屏幕显示均以字符流形式处理。
1、基础用法
cin 用作输入,cout 输出。
#include<iostream>
using namespace std;
int main(){
int a;
char c;
float f;
cin >> a; // 读取 1 个整数
cin >> c; // 读取 1 个字符
cin >> f; // 读取 1 个浮点数
cout << "打印结果:" << endl;
cout << a << endl;
cout << c << endl;
cout << f << endl;
return 0;
}
2、连续输入输出
可以使用 << 在后面连续输出多个内容,通过连续输入输出的方式编写代码。
#include<iostream>
using namespace std;
int main(){
int a;
char c;
float f;
cin >> a >> c >> f;
cout << "打印结果:" << endl;
cout << a << endl << c << endl << f << endl;
return 0;
}
3、分析 cin 和 cout 的优势和劣势
(1)优势
cin的好处:当输入若干个变量(数据量很少)时,可通过>>用一行代码完成接收,且无需关心数据的类型;和scanf函数相比,代码书写更简洁明了。cout的好处:可以用来连续输出多个数值,且无需考虑数值的类型(自身会做类型处理);和printf相比更方便。
(2)劣势
cin/cout 的劣势(对比 scanf/printf):
- 效率低:默认同步 stdio,大数据量下易超时(需手动关闭同步);
- 格式控制麻烦:小数位数、进制等设置比 printf 繁琐;
- 输入灵活性差:复杂分隔符/格式处理不如 scanf 方便;
- 错误处理复杂:类型不匹配时需手动清理状态。
四、cout 的格式输出
printf 可通过指定格式输出数据。cout 也能指定输出格式,结合 <iomanip>(IO manipulators)头文件中的操纵符,即可灵活控制输出格式。
1、控制宽度和填充
setw:设置字段宽度(只对紧接着的输出项有效)。默认右对齐。
setfill:设置填充字符。(紧跟着 setw)
#include<iostream>
using namespace std;
#include<iomanip>
int main(){
int a = 123;
cout << "默认宽度:" << a << endl;
cout << "宽度设置为 10:" << setw(10) << a << endl;
cout << "宽度为 10,不够时填充*:" << setw(10) << setfill('*') << a << endl;
return 0;
}
2、控制数值格式
using namespace std;
#include<iomanip>
int main(){
double pi = 3.141592653589793;
cout << "默认:" << pi << endl;
cout << "固定小数点方式:" << fixed << pi << endl;
cout << "科学计数法方式:" << scientific << pi << endl;
cout << "固定小数点,小数点后 2 位有效数字:" << fixed << setprecision(2) << pi << endl;
return 0;
}
3、控制整数格式
#include<iostream>
using namespace std;
int main(){
int num = 20;
cout << "十进制(dec):" << dec << num << endl; // 默认,输出 20
cout << "十六进制(hex):" << hex << num << endl; // 输出 14
cout << "八进制(oct):" << oct << num << endl; // 输出 24
return 0;
}
注意 这些操纵符是'全局生效'的——一旦设置,后续所有整数输出都会沿用该进制,直到重新修改(如再次用 dec 切回十进制)。
#include<iostream>
using namespace std;
int main(){
int num = 20;
cout << "十进制(dec):" << dec << num << endl;
cout << "十六进制(hex):" << hex << num << endl;
cout << "八进制(oct):" << oct << num << endl;
cout << "十进制(dec):" << dec << num << endl; // 恢复十进制
cout << num << endl;
return 0;
}
4、控制对齐方式
设置宽度时默认右对齐,可使用 left/right 进行左/右对齐。
#include<iostream>
using namespace std;
#include<iomanip>
int main(){
int n = 123;
cout << "右对齐:" << setw(10) << right << n << endl;
cout << "左对齐:" << setw(10) << left << n << endl;
return 0;
}
五、总结
本章讲解了 C++ 的输入输出方式及 cout 的格式控制。掌握这些知识有助于更好地进行算法竞赛及 C++ 开发。

