当前位置:首页 > 技术 > 正文内容

C++输入输出机制与控制流详解

访客 技术 2026年8月11日 1

C++程序的交互能力依赖于标准库提供的输入输出流(I/O streams)以及灵活的控制流语句。本节系统介绍如何通过cincout实现用户交互,利用std::stringstream安全转换数据类型,并深入剖析ifswitchwhilefor及范围循环等结构在逻辑分支与重复执行中的应用。

标准输入输出流

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用于立即退出最内层循环或switchcontinue跳过当前迭代剩余部分,直接进入下一次循环;goto虽存在但应避免使用,因其破坏结构化编程原则并可能引发资源泄漏。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。