输入输出
C++ 的输入输出操作
该页部分内容使用 AI 技术辅助生成。
输入输出是让程序和用户“对话”的基本方法。比如,程序可以把结果显示在屏幕上,也可以让用户输入一些数据。在 C++ 中,最基础的输入输出方式是通过标准输入(键盘)和标准输出(屏幕)进行数据的读取和显示。本节会一步一步带你了解这些操作,让你的程序能开始和用户互动。
输出
C++ 风格的输出: cout
在 Hello World 一章中,我们提到了 cout 这个关键词。cout 就是 C++ 中用来把内容输出到屏幕(标准输出流)上的对象。
cout 的使用很简单。首先引入 iostream 头文件(cout 是在这个头文件中定义的),然后使用输出运算符 <<,把数据“插入”左侧的 cout 对象,最终让数据在屏幕中显示出来。如果想要输出多个数据(特别是不同类型的),只需要使用多个 << 运算符依次插入即可,就像下面这样。
#include <iostream>
using namespace std;
int main() {
int a = 3;
char b = 'H';
cout << "Hello, World" << " - " << a << " - " << b << endl;
return 0;
}上述程序的输出结果为 Hello, World - 3 - H (输出的末尾还有一个换行(endl),此处省略)
Tips
cout 和 endl(包括下文会接触的 cin 输入)都是定义在 iostream 头文件中的 std 命名空间里的(C++ 中命名空间是一个可以防止同名对象冲突的机制,以后会提到)。因此,使用这些内容时,必须在引入头文件后,使用 using namespace std; 来全局引入 std 命名空间。如果不想全局引入,也可以在 cout 等关键词前加上 std:: 来局部指定命名空间,也就是这样:
std::cout << "Hello, World" << std::endl;对于初学者而言,我们目前基本不会接触到名称的冲突,所以更推荐使用全局引入命名空间的方式。
C 风格的输出: printf
C++ 作为 C 的加强版,自然是兼容大部分 C 的特性的。因此,我们也可以使用 C 形式的输出方式:printf。printf 位于 C 语言的 stdio.h 头文件中(你也可以使用 C++ 对 C 标准库的封装 cstdio 头文件来引入 printf)。
#include <stdio.h> // 或者在 C++ 中使用 #include <cstdio>
int main() {
int a = 3;
char b = 'H';
printf("Hello, World - %d - %c\n", a, b);
return 0;
}如果使用 #include <stdio.h>,这段代码是可以作为 C 语言程序编译的,但是如果使用 <cstdio>,则只能作为 C++ 程序编译。
printf 可以用来格式化输出内容。比如,你可以用 %d 输出整数,用 %f 输出小数,用 %s 输出字符串。下面是常见的格式化符号和它们的作用:
| 格式化符 | 作用 | 举例 |
|---|---|---|
%d | 输出整数 | printf("%d", 123); // 输出 123 |
%c | 输出单个字符 | printf("%c", 'A'); // 输出 A |
%s | 输出字符串 | printf("%s", "Hello"); // 输出 Hello |
%f | 输出小数(浮点数) | printf("%f", 3.14); // 输出 3.140000 |
%p | 输出指针地址 | int a; printf("%p", &a); // 输出类似 0x7ffee4b3c8ac 的地址 |
%x | 输出十六进制整数 | printf("%x", 255); // 输出 ff |
%o | 输出八进制整数 | printf("%o", 10); // 输出 12 |
%e | 用科学计数法输出小数 | printf("%e", 12345.678); // 输出 1.234568e+04 |
%g | 自动选择最合适的浮点数格式 | printf("%g", 123.456); // 输出 123.456 |
除了上面这些基本的格式化符号,printf 还可以通过一些“修饰符”来控制输出的样式,比如小数点后保留几位、输出宽度、对齐方式等。这样可以让你的输出更加美观和规范。
| 写法 | 说明 | 示例 | 输出结果 |
|---|---|---|---|
%f | 默认输出 6 位小数 | printf("%f", 3.14); | 3.140000 |
%.2f | 保留 2 位小数 | printf("%.2f", 3.14159); | 3.14 |
%8.2f | 总宽度 8,保留 2 位小数,右对齐 | printf("%8.2f", 3.14); | 3.14 |
%-8.2f | 总宽度 8,保留 2 位小数,左对齐 | printf("%-8.2f", 3.14); | 3.14 |
%04d | 输出宽度 4,不足补零 | printf("%04d", 5); | 0005 |
%10s | 字符串宽度 10,右对齐 | printf("%10s", "Hi"); | Hi |
%-10s | 字符串宽度 10,左对齐 | printf("%-10s", "Hi"); | Hi |
另外还有 puts、putchar 等输出方式,感兴趣的可以自行探索。
输入
C++ 风格的输入: cin
在 C++ 中,最常用的输入方式是使用 cin 对象。cin 也是定义在 iostream 头文件中的,和 cout 类似,只不过它是用来从标准输入(通常是键盘)读取数据。
使用 cin 的运算符和 cout 的运算符正好相反,是流输入运算符 >>。
#include <iostream>
using namespace std;
int main() {
int a, b;
char c;
cin >> a >> b >> c;
cout << a << " " << b << " " << c << endl;
return 0;
}然后在控制台依次输入 整数 整数 字符,例如 123 456 A,程序将会按照你的输入进行输出。
C 风格的输入: scanf
在 C++ 中,也可以使用 C 风格的输入函数 scanf,它和 printf 一样定义在 stdio.h 或 cstdio 头文件中。scanf 用于从标准输入读取数据,同时还可以使用格式化字符串指定输入的数据类型和输入格式。
#include <stdio.h> // 或者在 C++ 中 #include <cstdio>
int main() {
int a, b;
char c;
scanf("%d %d %c", &a, &b, &c);
printf("%d %d %c\n", a, b, c);
return 0;
}输入时需要依次输入两个整数和一个字符,例如 123 456 A,程序会输出 123 456 A。
scanf 的第一个参数是格式控制字符串,常用的格式说明符有:
| 格式说明符 | 作用 | 变量类型 | 备注 |
|---|---|---|---|
%d | 读取一个整数 | int | |
%f | 读取一个浮点数 | float | |
%lf | 读取一个双精度浮点数 | double | |
%c | 读取一个字符 | char | |
%s | 读取一个字符串 | char 数组 | 不可以使用 C++ 的 string 类型 |
每个变量都需要加上取地址符 &,否则无法正确读取输入。
scanf 是一个 C 的输入函数,所以只能使用 C 风格的字符串,也就是字符数组,而不能使用 C++ 的 string 类型。
读取一个字符串可以这样写:
char str[100];
scanf("%s", str);
printf("%s\n", str);注意:输入 hello world 时,只会读取 hello,因为 %s 遇到空格就会停止。cin 也是同理。如果想要获取整行的字符串,可以尝试使用 getline 读取整行或者使用 getchar 自行控制。
scanf 支持格式化输入,可以在格式字符串中加入分隔符或其他字符。例如:
int a, b;
scanf("%d-%d", &a, &b);这样,输入时必须严格按照 数字-数字 的格式,比如 123-456,中间的 - 必须有,否则输入会失败。如果格式字符串中有空格或其他字符,输入时也必须完全匹配这些字符。例如:
scanf("%d , %d", &a, &b); // 输入时必须是 123 , 456其他输入的函数还有 getline、fgets、getchar 等等,感兴趣的可以自行探索。
转义字符
在输出字符串时,有些字符无法直接输入或显示,比如换行符、制表符、引号等。这时我们需要使用转义字符。
转义字符以反斜杠 \ 开头,后面跟一个特定的字符,用来表示特殊的含义。
常用转义字符
| 转义字符 | 含义 | 示例 |
|---|---|---|
\n | 换行符 | cout << "第一行\n第二行" << endl; |
\t | 制表符(Tab) | cout << "姓名\t年龄\t城市" << endl; |
\" | 双引号 | cout << "他说:\"你好\"" << endl; |
\' | 单引号 | cout << '\'' << endl; |
\\ | 反斜杠 | cout << "路径: C:\\Users" << endl; |
\0 | 空字符(字符串结束标志,使用 C++ 的字符串建议不用自己使用,可能会导致未知行为) | - |
\r | 回车符(和换行符不同) | - |
示例代码
#include <iostream>
using namespace std;
int main() {
cout << "Hello\nWorld!" << endl; // 换行
cout << "姓名\t年龄\t城市" << endl; // 制表符
cout << "他说: \"Hello, World!\"" << endl; // 引号
cout << "文件路径: C:\\Program Files" << endl; // 反斜杠
return 0;
}输出结果:
Hello
World!
姓名 年龄 城市
他说: "Hello, World!"
文件路径: C:\Program FilesTips
endl 和 转义字符 \n 都可以实现换行,但 endl 会刷新缓冲区,而 \n 不会。
关于 \r 和 \n 的区别
\n:换行符,光标移到下一行\r:回车符,光标回到当前行开头(会覆盖原内容)\r\n:Windows 系统的标准换行符,等于回车+换行
在 C++ 中,通常只使用 \n 即可实现换行。\r 常用于制作进度条等需要覆盖显示的场合。