首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从0开始学习C++:C/C++ 输入输出全攻略(附带8道经典OJ题)

从0开始学习C++:C/C++ 输入输出全攻略(附带8道经典OJ题)

作者头像
给东岸来杯冷咖啡
发布2026-01-12 20:32:12
发布2026-01-12 20:32:12
3030
举报

从新手入门到竞赛速查手册

作者:一位大二的“踩坑”学长 这是我的主页 东岸 适用人群:C++ 初学者、算法竞赛入门者(已掌握变量、循环、函数等基础) 阅读建议:边读边敲代码,效果更佳! 精选专栏:《数据结构杂谈》《C++入门》《蓝桥杯备战参考指南》

在 C/C++ 的世界里,输入输出(I/O)是程序与世界的第一次对话。无论你是刚接触编程的新手,还是备战算法竞赛的选手,熟练掌握 scanf/printfcin/cout,不仅能避免“样例能过,提交 WA”的尴尬,还能在关键时刻提升运行效率。本文将带你系统掌握 C/C++ 输入输出的核心技能。

1. C 语言基础 I/O:getchar 与 putchar

虽然常被忽略,但 getchar() putchar() 是理解“字符流”的绝佳入口。

1.1 getchar():读取一个字符

  • 函数原型int getchar(void);
  • 头文件<cstdio>
  • 返回值:成功时返回读取字符的 ASCII 值(注意:是 int 类型!),失败或遇到文件结束符(EOF)时返回 -1
代码语言:javascript
复制
#include <cstdio>
#include <iostream>
using namespace std;

int main() {
    int ch = getchar();          // 读取一个字符(包括空格、回车)
    cout << "ASCII: " << ch << endl;
    cout << "字符: " << (char)ch << endl;
    return 0;
}

来看运行效果

💡 为什么返回 int 而不是 char 因为 EOF 通常是 -1,而 char 类型可能无法表示负数(取决于编译器是否默认 signed char)。用 int 可安全区分有效字符与 EOF。

1.2 putchar():输出一个字符

函数原型int putchar(int character);返回值:成功返回输出字符,失败返回 EOF

代码语言:javascript
复制
#include <cstdio>
int main() {
    int ch = getchar();
    char ch1 = 'C';
    char ch2 = 'B';
    char ch3 = 'A';
    putchar(ch1);  // 输出该字符
    putchar(ch2);
    putchar(ch);
    putchar('\n'); // 换行
    putchar(ch3); 
    return 0;
}

运行效果:

📌 应用场景: 在算法竞赛中,getchar/putchar 常用于快速 I/O 优化(尤其处理大量字符时),因其比 cin/cout 更轻量。

2. C 语言主力 I/O:scanfprintf

这组函数在竞赛中使用频率极高,尤其在格式控制方面无可替代。

2.1 printf:格式化输出的艺术

基本规则:

printf() 的作⽤是将参数⽂本输出到屏幕。 它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。

printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换 ⾏。 为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。

占位符

printf() 可以在输出⽂本中指定占位符。 所谓 “占位符”,就是这个位置可以⽤其他值代⼊

代码语言:javascript
复制
#include <cstdio>
// 输出 There are 3 apples 
int main()
{
 printf("There are %d apples\n", 3);
 return 0;
}

上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要 ⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这 ⾥代⼊的值必须是⼀个整数。 printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果 就是 There are 3 apples

占位符

含义

%d

int 整数

%lld

long long

%f

float / double

%c

字符

%s

C风格字符串(char[ ])

%lf

double (仅用于scanf)

%%

输出一个 %

格式化技巧

代码语言:javascript
复制
#include <cstdio>
int main() {
    // 1. 限定最小宽度(右对齐)
    printf("%5d\n", 123);      // 输出:"  123"

    // 2. 左对齐
    printf("%-5d\n", 123);     // 输出:"123  "

    // 3. 控制小数位数
    printf("%.2f\n", 3.14159); // 输出:"3.14"

    // 4. 宽度 + 小数位数
    printf("%8.2f\n", 3.14);   // 输出:"    3.14"

    // 5. 输出百分号
    printf("正确率:%.1f%%\n", 95.5); // 输出:"正确率:95.5%"
    return 0;
}

2.2 scanf:精准读取用户输入

scanf() 函数⽤于读取⽤⼾的键盘输⼊。

程序运⾏到 scanf() 这个语句时,会停下来,等待⽤⼾从键盘输⼊。

⽤⼾输⼊数据、按下回⻋键后, scanf() 就会处理⽤⼾的输⼊,将其存⼊变量。 scanf() 的语法跟 printf() 类似。

代码语言:javascript
复制
#include <cstdio>
int main()
{
 int i = 0;
 scanf("%d", &i);
 printf("%d\n", i);
 return 0;
}

这个时候我们运行:

会报错,这是为什么呢?

在 Visual Studio(特别是 VS2015 及以后版本) 中,默认启用了微软的安全增强机制。它认为像 scanf 、 gets 、 strcpy 这些“老派”C 标准库函数 存在安全隐患

那怎么办呢?

有一个常用的解决方法是加宏定义

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS

✅ 作用:告诉 VS “我知道风险,但我就是要用标准 scanf ”,于是它就不报错了。

基本规则
  • 必须传变量地址&var),数组名除外
  • %c 外,其他占位符自动跳过前导空白字符(空格、换行等)。
  • %c 不跳过空白!若需跳过,写成 " %c"(注意空格)。
返回值:多组输入的关键

scanf 返回成功读取的变量个数。竞赛中常用它判断是否读到 EOF:

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
int main() {
    int a, b;
    // 持续读取直到文件结束(如 Ctrl+Z / Ctrl+D)
    while (scanf("%d%d", &a, &b) == 2) {
        printf("%d + %d = %d\n", a, b, a + b);
    }
    return 0;
}

⚠️ 易错点提示: double 类型用 %lf(printf 中仍用 %f!) 不要写 scanf("%d\n", &x); —— \n 会等待下一个非空白字符!

3. C++ 流式 I/O:cincout

更安全、更简洁,但格式控制稍弱。

3.1 基本用法 & 连续输入输出

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main() {
    int a; char c; double d;
    cin >> a >> c >> d;              // 自动跳过空白,类型安全
    cout << "结果:" << a << ' ' << c << ' ' << d << endl;
    return 0;
}

优点:无需记占位符,自动类型识别,代码更简洁。 ❌ 缺点:默认无格式控制,速度略慢(可通过 ios::sync_with_stdio(false) 加速)。

3.2 格式化输出:<iomanip> 的妙用

要实现类似 printf 的控制,需引入 <iomanip>

代码语言:javascript
复制
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double pi = 3.1415926;

    // 1. 控制宽度和填充
    cout << "右对齐:" << setw(10) << pi << endl;
    cout << "左对齐:" << left << setw(10) << pi << endl;
    cout << "填充*: " << setfill('*') << setw(10) << 123 << endl;

    // 2. 控制小数位数
    cout << fixed << setprecision(2) << pi << endl; // 输出:3.14

    // 3. 进制输出
    cout << "十六进制:" << hex << 255 << endl; // 输出:ff
    return 0;
}

🔁 对比总结

4. 实战演练:8 道经典 OJ 题解析

练习1:浮点除法

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
 int a = 0;
 int b = 0;
 cin >> a >> b;
 printf("%.3lf\n", a * 1.0 / b);
 return 0;
}

练习2:甲流疫情死亡率

代码语言:javascript
复制
#include<cstdio>
int main()
{
 int a, b;
 scanf("%d%d", &a, &b);
 printf("%.3lf%%\n", b * 100.0 / a);
 return 0;
}

练习3:温度表达转化

代码语言:javascript
复制
#include <cstdio>
int main()
{
 double f = 0;
 scanf("%lf", &f);
 double c = 5 * (f - 32) / 9.0;
 printf("%.5lf\n", c);
 return 0;
}

练习4:计算并联电阻的阻值

代码语言:javascript
复制
#include <iostream>
#include<cstdio>

using namespace std;
int main()
{
 double r1 = 0, r2 = 0;
 cin >> r1 >> r2;
 double ret = 1.0 / (1.0 / r1 + 1.0 / r2);
 printf("%.2lf\n", ret);
 return 0;
}

练习5:与圆相关的计算

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
using namespace std;
const double PI = 3.14159;
double r, z, len, area;
int main()
{
 cin >> r;
 z = 2 * r;
 len = 2 * PI * r;
 area = PI * r * r;
 printf("%.4lf %.4lf %.4lf\n", z, len, area);
 
 return 0;
}

练习6:对⻬输出

代码语言:javascript
复制
#include<iostream>
#include<cstido>
using namespace std;

int main()
{
   int a, b,c;
 cin >> a >> b >> c;
 printf("%8d %8d %8d\n", a, b, c);
 return 0;
}

练习7:数字反转

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
 char a, b, c, d, e;
 cin >> a >> b >> c >> d >> e;
 cout << e << d << c << b << a << endl;
 return 0;
}

练习8:三角形面积

代码语言:javascript
复制
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
int main()
{
 double a, b, c;
 cin >> a >> b >> c;
 double p = (a + b + c) / 2;
 double area = sqrt(p * (p - a) * (p - b) * (p - c));
 printf("%.1f\n", area);
 return 0;
}

💡 使用建议: 刷题时,刻意使用 printf/scanfcin/cout 各写一遍,体会差异。竞赛中遇到“输出格式严格”的题,优先用 printf;逻辑复杂、数据量不大的题,可用 cin/cout 提高开发效率。

✅ 总结与建议

  • 竞赛推荐
    • 精确格式控制 → 用 printf/scanf
    • 快速读写大文件 → 关闭同步:
代码语言:javascript
复制
ios::sync_with_stdio(false);
cin.tie(nullptr);
  • 新手建议:先掌握 cin/cout 建立信心,再学 printf/scanf 提升控制力。
🤔 思考题
  1. 为什么 getchar() 返回 int 而不是 char?尝试用 char 接收 EOF 会发生什么?
  2. printf("%f", x)printf("%.6f", x)double x 的输出是否总是一样?为什么?

💬 如果你正在准备洛谷、牛客或蓝桥杯,欢迎在评论区留下你遇到的 I/O 难题,我们一起“踩坑”成长!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从新手入门到竞赛速查手册
  • 1. C 语言基础 I/O:getchar 与 putchar
    • 1.1 getchar():读取一个字符
    • 1.2 putchar():输出一个字符
  • 2. C 语言主力 I/O:scanf 与 printf
    • 2.1 printf:格式化输出的艺术
      • 基本规则:
      • 占位符
    • 2.2 scanf:精准读取用户输入
  • 3. C++ 流式 I/O:cin 与 cout
    • 3.1 基本用法 & 连续输入输出
    • 3.2 格式化输出:<iomanip> 的妙用
  • 🔁 对比总结:
  • 4. 实战演练:8 道经典 OJ 题解析
    • 练习1:浮点除法
    • 练习2:甲流疫情死亡率
    • 练习3:温度表达转化
    • 练习4:计算并联电阻的阻值
    • 练习5:与圆相关的计算
    • 练习6:对⻬输出
    • 练习7:数字反转
    • 练习8:三角形面积
  • ✅ 总结与建议
    • 🤔 思考题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档