C++输入输出机制与控制流详解
C++程序的交互能力依赖于标准库提供的输入输出流(I/O streams)以及灵活的控制流语句。本节系统介绍如何通过cin、cout实现用户交互,利用std::stringstream安全转换数据类型,并深入剖析if、switch、while、for及范围循环等结构在逻辑分支与重复执行中的应用。
标准输入输出流
C++将I/O抽象为"流"——一种字符序列的源头或终点,屏蔽底层设备细节。核心流对象包括:
std::cin:标准输入(通常为键盘)std::cout:标准输出(通常为屏幕)std::cerr:非缓冲错误输出std::clog:带缓冲的日志输出
日常开发中主要使用前两者。
输出操作
使用插入运算符<<向cout写入数据:
int score = 95;
std::cout << "Score: " << score << "\n"; // 输出:Score: 95
注意:"Hello"是字符串字面量,而Hello(无引号)被解释为变量名。换行可用"\n"或std::endl;后者除换行外还会刷新缓冲区,适用于需立即显示的场景。
输入操作
使用提取运算符>>从cin读取数据:
int age;
std::cin >> age; // 仅读取首个整数,遇空格/换行停止
该方式无法处理输入格式错误(如输入字母而非数字),且会跳过空白符。若需读取整行(含空格),应使用std::getline:
std::string full_name;
std::getline(std::cin, full_name); // 读取至换行符
字符串流转换
<sstream>头文件提供std::stringstream,支持字符串与数值双向转换:
#include <sstream>
std::string input = "42.5";
double value;
std::stringstream(input) >> value; // value = 42.5
// 安全输入示例
std::string line;
std::getline(std::cin, line);
if (std::stringstream(line) >> value) {
std::cout << "Valid number: " << value << "\n";
} else {
std::cout << "Invalid input\n";
}
程序控制流
条件分支
if语句根据布尔表达式决定执行路径:
if (temperature > 30) {
std::cout << "Hot day\n";
} else if (temperature < 10) {
std::cout << "Cold day\n";
} else {
std::cout << "Mild weather\n";
}
当需匹配离散常量值时,switch更高效且可读性更强(但仅支持整型、枚举等常量表达式):
switch (grade) {
case 'A': std::cout << "Excellent\n"; break;
case 'B': std::cout << "Good\n"; break;
default: std::cout << "Unknown grade\n";
}
循环结构
while循环:先判断后执行,适用于次数未知的迭代:
int countdown = 5;
while (countdown > 0) {
std::cout << countdown-- << " ";
}
// 输出:5 4 3 2 1
do-while循环:先执行后判断,确保至少运行一次:
std::string cmd;
do {
std::cout << "Enter command: ";
std::getline(std::cin, cmd);
} while (cmd != "quit");
传统for循环:适合计数型迭代,包含初始化、条件检查、更新三部分:
for (int i = 0; i < 10; ++i) {
std::cout << i * i << " ";
}
// 输出:0 1 4 9 16 25 36 49 64 81
范围for循环:简化容器遍历,自动推导元素类型:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (const auto& num : numbers) {
std::cout << num * 2 << " ";
}
// 输出:2 4 6 8 10
流程跳转
break用于立即退出最内层循环或switch;continue跳过当前迭代剩余部分,直接进入下一次循环;goto虽存在但应避免使用,因其破坏结构化编程原则并可能引发资源泄漏。