Logo成贤计协指南

输入输出

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

coutendl(包括下文会接触的 cin 输入)都是定义在 iostream 头文件中的 std 命名空间里的(C++ 中命名空间是一个可以防止同名对象冲突的机制,以后会提到)。因此,使用这些内容时,必须在引入头文件后,使用 using namespace std; 来全局引入 std 命名空间。如果不想全局引入,也可以在 cout 等关键词前加上 std:: 来局部指定命名空间,也就是这样:

std::cout << "Hello, World" << std::endl;

对于初学者而言,我们目前基本不会接触到名称的冲突,所以更推荐使用全局引入命名空间的方式。

C 风格的输出: printf

C++ 作为 C 的加强版,自然是兼容大部分 C 的特性的。因此,我们也可以使用 C 形式的输出方式:printfprintf 位于 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

另外还有 putsputchar 等输出方式,感兴趣的可以自行探索。

输入

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.hcstdio 头文件中。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

其他输入的函数还有 getlinefgetsgetchar 等等,感兴趣的可以自行探索。

转义字符

在输出字符串时,有些字符无法直接输入或显示,比如换行符、制表符、引号等。这时我们需要使用转义字符

转义字符以反斜杠 \ 开头,后面跟一个特定的字符,用来表示特殊的含义。

常用转义字符

转义字符含义示例
\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 Files

Tips

endl 和 转义字符 \n 都可以实现换行,但 endl 会刷新缓冲区,而 \n 不会。

关于 \r\n 的区别

  • \n:换行符,光标移到下一行
  • \r:回车符,光标回到当前行开头(会覆盖原内容)
  • \r\n:Windows 系统的标准换行符,等于回车+换行

在 C++ 中,通常只使用 \n 即可实现换行。\r 常用于制作进度条等需要覆盖显示的场合。