第4章 程序的输入和输出

第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 整数
%lldlong 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 位小数。

SShowball OI知识手册