第4章 程序的输入和输出
程序需要把结果"输出"给用户,也需要从用户那里"输入"数据。C++ 提供 cin/cout,C 语言提供 printf/scanf。本章逐一讲解,并重点说明格式化输出与常见陷阱。
4.1 C++ 风格:cin 与 cout
使用 <iostream> 并配合 using namespace std;。
4.1.1 输出 cout(插入运算符 <<)
#include <iostream>
using namespace std;
int main()
{
int a = 8;
double b = 6.78;
char c = 'F';
string s = "C++"; // 需 #include <string>
cout << a << " " << b << " " << c << " " << s << endl;
return 0;
}
<<叫插入运算符,把右边内容"插入"到输出流;endl表示输出一个换行,并刷新缓冲区(\n只换行不强制刷新,一般可互换)。
4.1.2 输入 cin(提取运算符 >>)
cin 遇到空格、回车、Tab 就会停止读取当前变量。
int x;
double y;
char z;
string str;
cin >> x >> y >> z >> str; // 依次输入,用空格/回车分隔
输入示例:10 3.5 K hello → x=10, y=3.5, z='K', str="hello"。
caution
用 cin >> str 读取字符串时,遇到空格就停止,所以 "hello world" 只能读到 "hello"。要读取带空格的一整行,请用 4.4 的 getline。
4.2 格式化输出(<iomanip>)
| 控制符 | 作用 |
|---|---|
setw(n) | 设置下一个输出的宽度为 n(默认右对齐,不足补空格) |
left / right | 左对齐 / 右对齐 |
fixed | 以定点小数形式显示 |
setprecision(n) | 配合 fixed 时保留 n 位小数 |
setfill(c) | 与 setw 配合,用字符 c 填充空白 |
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double num = 123.45678;
cout << setw(10) << right << num << endl; // 宽度10,右对齐
cout << fixed << setprecision(2) << num << endl; // 123.46(保留2位)
cout << setw(8) << setfill('0') << 7 << endl; // 00000007
return 0;
}
note
setw(n) 只对紧跟其后的那一个输出有效,下一次输出需重新写 setw。而 fixed、setprecision、left/right 一旦设置会"持续生效",直到再次改变。
4.3 C 风格:printf 与 scanf
头文件 <cstdio>(或 C 的 <stdio.h>)。
4.3.1 输出 printf
| 格式符 | 含义 |
|---|---|
%d | 十进制 int 整数 |
%lld | long long 整数 |
%f | 浮点数(默认 6 位小数) |
%c | 单个字符 |
%s | 字符串 |
%x / %X | 十六进制 |
%o | 八进制 |
int a = 10;
float b = 3.14f;
char c = 'A';
char str[] = "Hello";
printf("a=%d b=%.2f c=%c str=%s\n", a, b, c, str);
// 输出:a=10 b=3.14 c=A str=Hello
%.2f表示保留 2 位小数;\n是换行符。
4.3.2 输入 scanf
caution
普通变量前必须加 & 取地址符;但字符数组(字符串)不加 &。
int a;
float b;
char c;
char s[20]; // 字符数组
scanf("%d %f %c %s", &a, &b, &c, s); // s 前不要 & !
4.4 读取一整行(含空格)
4.4.1 getline(C++ 字符串)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string line;
getline(cin, line); // 读取整行,直到遇到换行
cout << "你输入了:" << line << endl;
return 0;
}
4.4.2 cin.get 读取单个字符
char ch;
cin.get(ch); // 读取一个字符(包括空格、回车)
danger
cin >> 与 getline 混用陷阱:cin >> x 读完整数后会把行末的回车符留在输入缓冲区,getline 一上来就读到这个回车,结果读到一个空行。
解决方法:在 getline 之前用 cin.ignore() 丢掉残留的回车:
int age;
string name;
cin >> age;
cin.ignore(); // 抛弃缓冲区里的 '\n'
getline(cin, name); // 现在能正确读到整行
4.5 真题风格示例
【示例】输入一个整数 n,输出它的平方。(GESP 一级基础题型)
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << n * n << endl;
return 0;
}
【示例】输入圆的半径 r(浮点数),输出面积(保留 2 位小数)。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double r;
cin >> r;
cout << fixed << setprecision(2) << 3.14159 * r * r << endl;
return 0;
}
4.6 随堂检测
1. 下列能正确读取一个整数 a 的语句是( )。
- A.
cin >> a; - B.
cin << a; - C.
scanf("%d", a); - D.
cout >> a;
查看答案
答案:A。cin 用 >>;scanf 变量前要加 &;cout 用 << 输出。
2. 想让浮点数保留 3 位小数输出,正确的组合是( )。
- A.
setw(3) - B.
fixed << setprecision(3) - C.
setfill('3') - D.
left << 3
查看答案
答案:B。fixed 配 setprecision(3) 表示保留 3 位小数。