C++中的输入与输出
注:初学者只需要掌握cin、cout即可(2.2、3.2小节)
1.C++输入输出概述
using namespace std;(简化代码,避免重复写std::cin、std::cout);若不使用,则需全程写完整命名空间(如std::cin >> a;)。2.C++核心输入:cin详解
2.1 cin的基本语法
cin>>变量1>>变量2>>变量3>>...>>变量n;
2.2 基本用法示例
#include <iostream>
#include <string> // 读取string类型需包含此头文件
using namespace std;
int main() {
// 1. 读取整数(int)
int a;
cout << "请输入一个整数:";
cin >> a;
// 2. 读取浮点数(float/double)
double b;
cout << "请输入一个浮点数:";
cin >> b;
// 3. 读取单个字符(char)
char c;
cout << "请输入一个字符:";
cin >> c; // 注意:会跳过空白字符,若想读取空格/换行,需特殊处理
// 4. 读取字符串(string)
string str;
cout << "请输入一个字符串(不含空格):";
cin >> str; // 读取到空白字符(空格、换行)时停止
// 5. 连续读取多个变量
int x, y;
cout << "请输入两个整数(用空格分隔):";
cin >> x >> y;
// 输出读取到的数据
cout << "你输入的整数:" << a << endl;
cout << "你输入的浮点数:" << b << endl;
cout << "你输入的字符:" << c << endl;
cout << "你输入的字符串:" << str << endl;
cout << "你输入的两个整数:" << x << " " << y << endl;
return 0;
}2.3 cin的关键细节
2.3.1 读取char类型的注意事项
#include <iostream>
using namespace std;
int main() {
char c1, c2;
cout << "请输入两个字符(用空格分隔):";
cin >> c1; // 读取第一个非空白字符
cin.get(c2); // 读取下一个字符(包括空格、换行)
cout << "c1:" << c1 << ",c2:" << c2 << endl;
return 0;
}2.3.2 读取string类型的注意事项
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "请输入包含空格的字符串:";
cin.ignore(); // 忽略之前cin留下的换行符(关键!避免getline读取空值)
getline(cin, str); // 读取整行数据,包括空格,直到换行结束
cout << "你输入的字符串:" << str << endl;
return 0;
}2.3.3 cin的输入失败处理
#include <iostream>
using namespace std;
int main() {
int a;
cout << "请输入一个整数:";
cin >> a; // 若输入字母(如abc),cin会失败
// 判断cin是否失败
if (!cin) {
cout << "输入错误!请重新输入一个整数:" << endl;
cin.clear(); // 重置cin状态,使其恢复正常
cin.ignore(1000, '\n'); // 清空缓冲区(忽略最多1000个字符,直到换行)
cin >> a; // 重新读取整数
}
cout << "你输入的整数:" << a << endl;
return 0;
}2.3.4 cin的常用辅助函数
3.C++核心输出:cout详解
3.1 cout的基本语法
cout << 数据1 << 数据2 << ... << 数据n;
3.2 基本用法示例
#include <iostream>
#include <string>
using namespace std;
int main() {
// 1. 输出常量
cout << "Hello C++!" << endl; // 输出字符串常量
cout << 123 << " " << 3.14 << endl; // 输出整数、空格、浮点数
// 2. 输出变量
int a = 10;
double b = 3.14159;
string str = "输入输出详解";
cout << "整数a:" << a << endl;
cout << "浮点数b:" << b << endl;
cout << "字符串str:" << str << endl;
// 3. 输出表达式
cout << "a+5 = " << a+5 << endl;
cout << "b*2 = " << b*2 << endl;
// 4. 连续输出多个数据
cout << "a=" << a << ", b=" << b << ", str=" << str << endl;
return 0;
}3.3 cout的格式控制
3.3.1 浮点数格式控制
#include <iostream>
#include <iomanip> // 格式控制操纵符需包含此头文件
using namespace std;
int main() {
double pi = 3.1415926535;
// 默认输出(保留6位小数,可能用科学计数法)
cout << "默认输出pi:" << pi << endl; // 输出3.141593
// 配合fixed,保留3位小数
cout << "保留3位小数:" << fixed << setprecision(3) << pi << endl; // 输出3.142(四舍五入)
// 不配合fixed,保留5位有效数字
cout << "保留5位有效数字:" << setprecision(5) << pi << endl; // 输出3.1416
return 0;
}3.3.2 整数格式控制
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a = 100;
cout << "十进制:" << dec << a << endl; // 输出100(默认)
cout << "十六进制:" << hex << a << endl; // 输出64
cout << "八进制:" << oct << a << endl; // 输出144
// 设置输出宽度为5,默认右对齐
cout << "右对齐(宽度5):" << setw(5) << a << endl; // 输出 100(前面两个空格)
// 设置左对齐(宽度5)
cout << "左对齐(宽度5):" << left << setw(5) << a << endl; // 输出100 (后面两个空格)
return 0;
}3.3.3 其他常用格式控制
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int a = 100;
// 设置宽度为5,用'*'填充,右对齐
cout << setw(5) << setfill('*') << a << endl; // 输出**100
return 0;
}3.4 cout的关键细节
3.4.1 endl与'\n'的区别
示例(效率对比):
#include <iostream>
#include <time.h>
using namespace std;
int main() {
clock_t start, end;
// 用endl输出10000行
start = clock();
for (int i = 0; i < 10000; i++) {
cout << i << endl;
}
end = clock();
cout << "endl耗时:" << end - start << "ms" << endl;
// 用'\n'输出10000行
start = clock();
for (int i = 0; i < 10000; i++) {
cout << i << '\n';
}
end = clock();
cout << "'\\n'耗时:" << end - start << "ms" << endl;
return 0;
}3.4.2 格式控制的“持久性”
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
double a = 3.14, b = 1.2345;
cout << fixed << setprecision(2); // 设置固定小数位,保留2位(持久生效)
cout << a << endl; // 输出3.14
cout << b << endl; // 输出1.23(同样保留2位)
cout << setprecision(3); // 修改为保留3位
cout << b << endl; // 输出1.235
return 0;
}4.C语言输入:scanf详解
4.1 scanf的基本语法
scanf通过“格式控制字符串”指定输入数据的类型和格式,语法格式如下:
scanf("格式控制字符串", &变量1, &变量2, ..., &变量n);4.2 常用格式控制符
4.3 基本用法示例
#include <cstdio> // 使用scanf需包含此头文件
int main() {
// 1. 读取int类型
int a;
printf("请输入一个整数:");
scanf("%d", &a); // 变量a加&,格式控制符%d
// 2. 读取double类型(必须用%lf)
double b;
printf("请输入一个浮点数:");
scanf("%lf", &b);
// 3. 读取char类型
char c;
printf("请输入一个字符:");
scanf("%c", &c); // 会读取空白字符,需注意
// 4. 读取字符串(字符数组)
char str[100]; // 定义字符数组,存储字符串
printf("请输入一个字符串(不含空格):");
scanf("%s", str); // 字符串数组无需加&
// 5. 连续读取多个变量
int x, y;
printf("请输入两个整数(用空格分隔):");
scanf("%d %d", &x, &y); // 格式控制符之间加空格(可省略,scanf自动跳过空白)
// 输出验证
printf("你输入的整数a:%d\n", a);
printf("你输入的浮点数b:%.2f\n", b); // 输出时double可用%f
printf("你输入的字符c:%c\n", c);
printf("你输入的字符串str:%s\n", str);
printf("你输入的两个整数x、y:%d %d\n", x, y);
return 0;
}4.4 scanf的关键细节
4.4.1 格式控制符必须严格匹配
// 错误1:double类型用了%f
double b;
scanf("%f", &b); // 错误,应使用%lf
// 错误2:int类型用了%lf
int a;
scanf("%lf", &a); // 错误,应使用%d
// 错误3:字符串数组加了&
char str[100];
scanf("%s", &str); // 错误,字符串数组无需加&4.4.2 读取char类型的空白字符问题
#include <cstdio>
int main() {
int a;
char c;
printf("请输入一个整数和一个字符:");
scanf("%d", &a); // 输入10后按回车,缓冲区留下'\n'
// 解决方法1:在%c前加一个空格(跳过空白字符)
scanf(" %c", &c); // 格式控制符前加空格,跳过所有空白字符
// 解决方法2:用getchar()读取换行符
// getchar();
printf("a=%d, c=%c\n", a, c);
return 0;
}4.4.3 读取字符串的限制
char str[10]; // 数组长度为10,最多存储9个字符(最后一个'\0')
scanf("%9s", str); // 限制读取9个字符,避免溢出5.C语言输出:printf详解
5.1 printf的基本语法
printf("格式控制字符串", 数据1, 数据2, ..., 数据n);5.2 常用格式控制符
5.3 基本用法示例
#include <cstdio>
int main() {
int a = 100;
double b = 3.14159;
char c = 'A';
char str[] = "C++ Input Output";
// 1. 输出整数(基本用法)
printf("整数a(默认):%d\n", a);
printf("整数a(宽度5,右对齐):%5d\n", a); // 输出 100
printf("整数a(宽度5,左对齐):%-5d\n", a); // 输出100
printf("整数a(十六进制):%x\n", a); // 输出64
printf("整数a(八进制):%o\n", a); // 输出144
// 2. 输出浮点数
printf("浮点数b(默认):%f\n", b); // 默认保留6位小数,输出3.141590
printf("浮点数b(保留2位小数):%.2f\n", b); // 输出3.14
printf("浮点数b(保留4位小数):%.4f\n", b); // 输出3.1416(四舍五入)
// 3. 输出字符和字符串
printf("字符c:%c\n", c); // 输出A
printf("字符串str:%s\n", str); // 输出C++ Input Output
// 4. 输出表达式
printf("a+5 = %d\n", a+5); // 输出105
printf("b*2 = %.2f\n", b*2); // 输出6.28
// 5. 多个数据同时输出
printf("a=%d, b=%.2f, c=%c\n", a, b, c);
return 0;
}5.4 printf的关键细节
5.4.1 double类型的输出格式
double b = 3.14;
printf("%f\n", b); // 正确,输出3.140000
printf("%lf\n", b); // 也正确,同样输出3.140000(C++兼容)5.4.2 类型必须匹配
// 错误1:格式控制符数量少于数据数量
int a=10, b=20;
printf("%d\n", a, b); // 错误,多余的b不会输出,无报错但结果异常
// 错误2:格式控制符类型与数据不匹配
double c=3.14;
printf("%d\n", c); // 错误,输出乱码5.4.3 浮点数的四舍五入
double d1 = 3.14159, d2 = 3.14559;
printf("d1保留2位小数:%.2f\n", d1); // 输出3.14(第四位是1,舍去)
printf("d2保留2位小数:%.2f\n", d2); // 输出3.15(第四位是5,进1)6.四种方式对比总结
6.1 核心对比表
方式 | 类型 | 核心特点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
cin | C++流 | 自动识别类型,无需格式控制 | 语法简洁,上手容易,无需记忆格式符,面向对象 | 执行效率略低,输入失败需手动处理,读取空格/换行需特殊处理 | C++日常编程、初学者入门、数据量不大的场景 |
cout | C++流 | 自动识别类型,可通过操纵符控制格式 | 语法简洁,格式控制灵活(操纵符),可读性强 | 执行效率略低,endl刷新缓冲区影响效率,复杂格式控制不如printf灵活 | C++日常编程、初学者入门、大部分输出场景 |
scanf | C语言函数 | 需手动指定格式控制符,需加取地址符 | 执行效率高,输入大量数据时优势明显,语法紧凑 | 语法繁琐,需记忆格式符,格式不匹配易出错,读取空格/换行需特殊处理 | 大量数据输入、对效率有要求的场景、C/C++兼容编程 |
printf | C语言函数 | 需手动指定格式控制符,格式控制精细 | 执行效率高,格式控制灵活精细,适合复杂输出 | 语法繁琐,需记忆格式符,格式不匹配易输出乱码 | 复杂格式输出、大量数据输出、对效率有要求的场景、C/C++兼容编程 |
6.2 新手建议
7.总结
8.cin和cout常见错误
8.1 cin常见错误案例及解决方案
案例1:cin读取string后,getline读取空值(高频错误)
错误代码:
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
string address;
cout << "请输入姓名:";
cin >> name; // 读取姓名(不含空格)
cout << "请输入地址(含空格):";
getline(cin, address); // 错误:读取到空值,直接跳过输入
cout << "姓名:" << name << ",地址:" << address << endl;
return 0;
}#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
string address;
cout << "请输入姓名:";
cin >> name;
cin.ignore(1000, '\n'); // 关键:清空缓冲区到换行符,忽略换行
cout << "请输入地址(含空格):";
getline(cin, address); // 正常读取地址
cout << "姓名:" << name << ",地址:" << address << endl;
return 0;
}案例2:cin输入类型不匹配,后续输入全部失效
#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "请输入第一个整数:";
cin >> a; // 若输入字母(如abc),输入类型不匹配
cout << "请输入第二个整数:";
cin >> b; // 错误:后续cin操作失效,无法读取数据
cout << "你输入的两个整数:" << a << " " << b << endl;
return 0;
}!cin判断cin是否处于失败状态,若失败,用cin.clear()重置cin状态(解除失败状态),再用cin.ignore()清空输入缓冲区中的错误数据,最后重新读取正确数据,确保后续cin操作正常执行。修改后代码如下:#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "请输入第一个整数:";
cin >> a; // 若输入非整数,cin进入失败状态
// 判断cin是否失败,若失败则重置并重新读取
if (!cin) {
cout << "输入错误!请重新输入一个整数:" << endl;
cin.clear(); // 重置cin状态,解除失败状态
cin.ignore(1000, '\n'); // 清空缓冲区的错误数据(最多1000个字符,直到换行)
cin >> a; // 重新读取第一个整数
}
// 读取第二个整数(此时cin已恢复正常)
cout << "请输入第二个整数:";
cin >> b;
// 输出验证
cout << "你输入的两个整数:" << a << " " << b << endl;
return 0;
}cin.clear()仅重置状态,不会清空缓冲区的错误数据,必须配合cin.ignore()使用,否则错误数据会被后续cin继续读取,导致再次失败。若需兼容多次输入错误,可将“判断-重置-重新读取”的逻辑封装为循环,确保读取到正确数据后再继续执行程序。扫描二维码推送至手机访问。
版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。


