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

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自己的网页编译器,自己写了一个库函数,有点古怪呢......

http://www.xdnf.cn/news/7394.html

相关文章:

  • 最小质因子之和(JAVA)线性筛
  • 内置分流器直流表:新能源高精度计量核心技术突破
  • Halcon设置不同分辨率来读取摄像头图片
  • 【QT】一个界面中嵌入其它界面(一)
  • vue2.0 组件
  • YoloV8改进策略:卷积篇|风车卷积|即插即用
  • python数学运算 2024年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
  • 涨薪技术|0到1学会性能测试第71课-T-SQL调优
  • 【Linux系统】Linux入门系统程序−进度条
  • 【esp32 控制台】-命令
  • 抽奖相关功能测试思路
  • Python学习之Flask框架(二)
  • 【达梦数据库】过程、函数、包头和包体详解零基础
  • Linux串口绑定
  • 佰力博与您探讨绝缘材料介电性能测试的方法。
  • Linux权限练习题
  • C++:因子问题
  • 基于SpringBoot的小型民营加油站管理系统
  • 【JAVA】使用javax.mail发送qq邮件
  • Notepad++ 学习(三)使用python插件编写脚本:实现跳转指定标签页(自主研发)
  • [Linux排查] “Permission Denied“?一文解决Linux文件/目录权限不足问题
  • 头歌之软件工程-用例设计
  • 《中国智算中心市场发展研究报告》:算力政策与AI技术双重驱动下的供需两旺
  • 2025年即时通讯APP如何抵御DDoS攻击?全链路防御方案与实战解析
  • 10、底层注解-@Conditional条件装配
  • 绿幕抠图与虚拟背景:直播美颜SDK开发前沿技术探索
  • Keil 调试模式下拷贝Flash,RAM中的数据
  • 双周报Vol.72:字段级文档注释支持、视图类型现为值类型,减少内存分配
  • 实战手册--如何针对衡石分析平台的数据集成详解
  • 配电房值守难题终结者:EdgeView智能监控的7×24小时守护