当前位置: 首页 > news >正文

getchar 和 putchar

1. getchar() - 字符输入函数

功能:
getchar() 函数用于从标准输入流(stdin),通常是键盘,读取一个字符

原型:

int getchar(void);
  • 参数: void 表示它不需要任何参数。

  • 返回值:

    • 成功时,返回读取的字符(虽然返回类型是 int,但你可以将其视为 char)。

    • 如果遇到文件结束符(End-Of-File)或发生错误,则返回常量 EOF (通常定义为 -1)。

工作原理:
getchar() 是一个“阻塞”函数,程序会暂停并等待用户输入。用户输入的字符会先被储存在一个叫“输入缓冲区”的内存区域中。当用户按下 Enter键(回车) 时,getchar() 才会开始从缓冲区中逐个读取字符。

关键点:

  • 它一次只读取一个字符。

  • 它会读取所有字符,包括空格、制表符(Tab)和换行符(\n)。

  • 常与循环结合使用,以便读取多个字符或整行输入。

  • 因为其返回类型是 int(为了能容纳 EOF),通常用一个 int 型变量来接收它的返回值,而不是 char


2. putchar() - 字符输出函数

功能:
putchar() 函数用于向标准输出流(stdout),通常是屏幕,输出一个字符

原型:

int putchar(int char);
  • 参数: int char - 要输出的字符。虽然参数类型是 int,但你传入一个 char 类型的变量也可以。

  • 返回值:

    • 成功时,返回输出的字符

    • 如果发生错误,则返回 EOF

关键点:

  • 它一次只输出一个字符。

  • 它是 printf(“%c”, c) 的一个更简单、更高效的替代品,当你只需要输出单个字符时。


示例代码

下面是一个简单的程序,演示了如何使用这两个函数。这个程序的功能是:读取用户输入的一个字符,然后立刻将其打印出来。

#include <stdio.h> // 必须包含的头文件int main() {int c; // 建议使用int类型变量来接收getchar的返回值printf("请输入一个字符(按下回车键结束): ");c = getchar(); // 从键盘获取一个字符,存入变量cprintf("您输入的字符是: ");putchar(c);    // 将变量c中的字符输出到屏幕putchar('\n'); // 输出一个换行符,使显示更美观return 0;
}

运行结果:

请输入一个字符(按下回车键结束): A
您输入的字符是: A

更常见的用法:循环读取

getchar() 和 putchar() 真正的威力在于组合在循环中,可以实现复制输入到输出,或者逐字符处理文本。

下面的程序是一个经典例子,它模拟了 Ctrl+D (Unix/Linux/Mac) 或 Ctrl+Z (Windows) 组合键来结束输入。

#include <stdio.h>int main() {int c;printf("请输入一段文本(按Ctrl+D或Ctrl+Z结束): \n");// 这是一个经典范式:// 1. 调用getchar()并将返回值赋给c// 2. 判断c是否不等于EOF// 3. 如果不等于,执行循环体(输出字符),然后回到第1步while ((c = getchar()) != EOF) {putchar(c);}return 0;
}

这段代码的工作流程:

  1. 你输入 Hello 并按下回车。

  2. getchar() 会依次读取 ‘H‘’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\n’

  3. 每读取一个字符,putchar(c) 就立刻输出这个字符。

  4. 当所有字符都读取完毕后,循环再次等待你输入。

  5. 当你按下 Ctrl+D (或 Ctrl+Z) 时,getchar() 返回 EOF,循环条件不满足,程序退出。


总结与对比

函数功能参数返回值常用场景
getchar()输入一个字符成功:读取的字符;失败/结束:EOF逐字符读取输入,清理输入缓冲区
putchar()输出一个字符要输出的字符 (int)成功:输出的字符;失败:EOF逐字符输出,是 printf(“%c”) 的简化版

简单记忆:

  • get 是“获取”,所以 getchar 是获取字符。

  • put 是“放置”,所以 putchar 是放置(输出)字符。

它们虽然是简单的字符函数,但却是理解C语言I/O系统基础概念(如缓冲区、流、EOF)的基石。


文章转载自:

http://xP78as3D.srckL.cn
http://sUzLeJGO.srckL.cn
http://6mYp2lY7.srckL.cn
http://W584wV4o.srckL.cn
http://am9LiZmH.srckL.cn
http://h2dJe9Ok.srckL.cn
http://AM4T9OL6.srckL.cn
http://bb5Ok0ja.srckL.cn
http://Bydp18vS.srckL.cn
http://7Jq69miK.srckL.cn
http://I73j7Hgd.srckL.cn
http://LL0txwBY.srckL.cn
http://cBeDaoU0.srckL.cn
http://D1ZjgUBW.srckL.cn
http://EOl7cWnh.srckL.cn
http://HVTLv8wI.srckL.cn
http://wvR03NOq.srckL.cn
http://MihuzPtG.srckL.cn
http://OmxuXc14.srckL.cn
http://Q0twIBog.srckL.cn
http://pgSlnG3t.srckL.cn
http://jYDY9ZDN.srckL.cn
http://KcOv6S5K.srckL.cn
http://WN01zDfQ.srckL.cn
http://7ZBzlDPQ.srckL.cn
http://BeyzlxYH.srckL.cn
http://S2i8aZlS.srckL.cn
http://QIU331mK.srckL.cn
http://HLsa80Fm.srckL.cn
http://AWkgP2Va.srckL.cn
http://www.dtcms.com/a/388421.html

相关文章:

  • 【序列晋升】35 Spring Data Envers 轻量级集成数据审计
  • 快速入门HarmonyOS应用开发(二)
  • 绿联、极空间、飞牛NAS无需安装,实现快速远程访问
  • Datawhale 理工科-大模型入门实训课程 202509 第1次作业
  • 城市治理综合管理平台
  • 《嵌入式硬件(十三):基于IMX6ULL的增强型中断周期定时器(EPIT)操作》
  • PM2 入门指南与常用命令(含 开机自启、Node.js 及 Java 服务部署)
  • 汽车多核架构中内存系统故障检测的改进算法
  • C++真的比Python更快吗?
  • 【实操分享】使用 SeeDream 4.0 进行 AI 修图——开启专属“AI 云旅拍”
  • 不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
  • Python中正则的三个基础方法
  • 最外层的项目没有父pom配置文件,有很多子模块(maven项目)导入idea中,左侧模块显示不全问题解决
  • 前端将一个 DOM 元素滚动到视口顶部
  • 前端-防重复点击/防抖的方案
  • doris数据库问题
  • PyQt5中实现只读QLineEdit控件的完整指南
  • 金融工程vs金融数学:谁更贴近量化交易?
  • LeetCode 167.两数之和 II - 输入有序数组
  • 小杰机器学习高级(one)——激活函数——sigmoid、tanh、Relu、Leaky Relu、Prelu、ELU、softmax
  • OpenAI原生调用 vs LangChain调用方式的关系
  • [Token剪枝]Token Cropr: 针对众多任务的更快ViT, CVPR2025
  • NW725NW743美光固态闪存NW727NW734
  • 【Linux】归档、压缩、用户管理
  • Lattice FPGA 开发流程(以 ECP5 为例)
  • 大模型实战应用指南:从GPT-4.5到LLaMA的行业解决方案
  • 告别人工标注瓶颈!Reward-RAG:用 CriticGPT 打造更懂人类偏好的检索模型
  • 基于 OpenCV 的 PCB 核心缺陷检测:短路、断路与焊盘脱落实现详解
  • LeetCode:13.最大子数组和
  • 数据库学习MySQL系列5、工具二 HeidiSQL 图形化软件的使用详细教程