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

CS50x 01 c

1 getchar()

在 C 语言里,getchar()是一个十分常用的函数,其功能是从标准输入(一般指键盘)读取单个字符。下面为你详细介绍它的用法。

基本语法

getchar()函数的原型定义在<stdio.h>头文件中,语法形式如下:

c

int getchar(void);

此函数会返回用户输入的字符所对应的 ASCII 码值(类型为int)。当遇到文件结束符(EOF)或者发生错误时,它会返回EOF(通常被定义为-1)。

使用示例

下面通过几个例子来说明getchar()的常见用法。

示例 1:读取单个字符

c

#include <stdio.h>int main() {int c;printf("请输入一个字符:");c = getchar();  // 读取一个字符printf("你输入的字符是:%c\n", c);printf("对应的ASCII码值是:%d\n", c);return 0;
}

代码解释
首先声明一个整型变量c,用于存储getchar()返回的字符值。程序会提示用户输入一个字符,接着调用getchar()读取该字符。最后,分别以字符形式(%c)和整数形式(%d)将输入的字符及其 ASCII 码值输出。

示例 2:连续读取多个字符

c

#include <stdio.h>int main() {int c;printf("请输入一串字符,以Ctrl+D(Linux/Mac)或Ctrl+Z(Windows)结束:\n");while ((c = getchar()) != EOF) {  // 循环读取字符直到文件结束printf("读取到字符:%c (%d)\n", c, c);}printf("已到达文件结束符(EOF)\n");return 0;
}

代码解释
在这个程序中,使用while循环不断调用getchar()读取字符,直到用户按下Ctrl+D(在 Linux/Mac 系统中)或者Ctrl+Z(在 Windows 系统中),此时会返回EOF,循环终止。每次读取到字符后,都会将其字符形式和 ASCII 码值输出。

示例 3:清除输入缓冲区

c

#include <stdio.h>int main() {int c;printf("请输入一个字符:");c = getchar();printf("你输入的字符是:%c\n", c);// 清除输入缓冲区中剩余的字符while ((c = getchar()) != '\n' && c != EOF);printf("缓冲区已清空,可以继续输入...\n");return 0;
}

代码解释
由于getchar()是逐字符读取输入的,当用户按下回车键(\n)时,输入缓冲区中可能会残留多余的字符。为了避免这些残留字符对后续输入操作产生影响,使用一个while循环将缓冲区中的字符逐个读取,直到遇到换行符\n或者文件结束符EOF

注意事项

  1. 返回类型为int:要将getchar()的返回值存储在int类型的变量中,而不是char类型。这是因为char类型可能无法正确表示EOF(通常为-1),从而导致判断文件结束条件时出现错误。
  2. 输入缓冲区问题getchar()只会读取一个字符,而用户输入的其他字符会留在输入缓冲区中,等待后续的输入函数读取。因此,在需要连续读取输入的场景中,要特别注意清除输入缓冲区,防止出现意外情况。
  3. EOF 的特殊性:在不同的操作系统中,触发 EOF 的方式有所不同。在 Linux/Mac 系统中,按下Ctrl+D会触发 EOF;在 Windows 系统中,需要按下Ctrl+Z然后再按回车键才能触发 EOF。

通过上述示例和注意事项,你应该能够在 C 语言中正确使用getchar()函数了。如果还有其他疑问,可以随时问我。

水一条帖子,我发现这个CS50x用的是MIT自己的网页编译器,自己写了一个库函数,有点古怪呢......

相关文章:

  • 什么是RDMA?
  • 2025.05.19【Barplot】柱状图的多样性绘制
  • 大语言模型(LLM)本身是无状态的,怎么固化记忆
  • PyLops 使用与介绍
  • 12.2/Q1,Charls最新文章解读
  • Python中的组合数据类型
  • Keepalived相关配置和高可用
  • 深度学习基础——神经网络优化算法
  • 2022年下半年信息系统项目管理师——综合知识真题及答案(3)
  • Pichome 任意文件读取漏洞复现(CVE-2025-1743)
  • GPU状态监控
  • 【C语言】大程序结构
  • mapbox-gl强制请求需要accessToken的问题
  • 【工具】ncdu工具安装与使用指南:高效管理Linux磁盘空间
  • 第八章 Java基础-字符串
  • 线程池中任务队列满-如何把多余的任务存储到Redis中
  • LintCode第42题-最大子数组 II-使用前缀和优化 + 动态规划法
  • 二叉树-模版题单
  • vue3个生命周期解析,及setup
  • 贵州某建筑物挡墙自动化监测
  • 学人、学术、学科、学脉:新时代沾溉下的中国西方史学史
  • 《缶翁的世界》首发:看吴昌硕等湖州籍书画家的影响
  • 博物馆书单|走进博物馆,去体验一场与文明的对话
  • 公示资费套餐、规范营销行为,今年信息通信行业将办好这十件实事
  • 就规范涉企行政执法专项行动有关问题,司法部发布解答
  • 中办、国办关于持续推进城市更新行动的意见