getchar()函数机制

getchar()函数实际上是int getchar(void),所以它返回的是ASCII码,所以只要是ASCII码表里有的字符它都能读取出来。在调用getchar()函数时,编译器会依次读取用户键入缓存区的一个字符(注意这里只读取一个字符,如果缓存区有多个字符,那么将会读取上一次被读取字符的下一个字符),如果缓存区没有用户键入的字符,那么编译器会等待用户键入并回车后再执行下一步 (注意键入后的回车键也算一个字符,输出时直接换行)。

来几个例子:

int main()
{char ch;printf("请输入字符:"); //1 2 回车scanf("%c", &ch); // 读取 1printf("%c", getchar()); //输出 2
}

运行实例:

第一个字符1被char ch读取,所以getchar()依次读取下一个未读取字符2


int main()
{char ch;printf("请输入字符:"); //1 回车scanf("%c", &ch); //读取 1printf("|1%c1|", getchar()); //读取并输出 回车
}

运行实例:

char ch读取第一个字符1,注意:我们说过,用户键入的回车也算一个字符,所以这里getchar()把回车读取了,输出时体现为换行


int main()
{char ch;printf("请输入字符:");//1 2 3 回车scanf("%c", &ch);// 读取 1printf("%c", getchar());// 读取并输出 2printf("%c", getchar());// 读取并输出 3printf("%c", getchar());// 读取并输出 回车
}

运行实例:


因为回车也算一个字符,所以如果在前面先要调用scanf()这种读取字符的函数后再键入新值调用getchar()(因为想要scanf()调用必须回车才能执行,就多了一个回车在缓存区中),建议清空缓存区再使用getchar(),不然getchar()会把前面回车也读取出来。注:可以使用fflush(stdin)清空缓存区(有的编译器用不了),推荐C语言基本语法:

char c_tmp;
while ((c_tmp = getchar() != '\n') && c_tmp != EOF);

例子:

int main()
{char ch[3];printf("请输入字符ch:");// 1 2 3 回车scanf("%s", &ch);// 读取123printf("字符ch的值:%s\n",ch);//输出 字符ch的值:123char c_tmp;while ((c_tmp = getchar() != '\n') && c_tmp != EOF);printf("请输入字符:");// 1  2  3 回车printf("%c", getchar());  //由于清空了缓存区,第一个getchar()并没有读取123之后的回车,而是读取的1printf("%c", getchar());// 读取并输出2printf("%c", getchar());// 读取并输出3
}

运行实例:

如果没有清空缓存区呢?(结果可能有点不好理解,多分析一下)

int main()
{char ch[3];printf("请输入字符ch:");// 1 2 3 回车scanf("%s", &ch);// 读取123printf("字符ch的值:%s\n",ch);// char c_tmp;// while ((c_tmp = getchar() != '\n') && c_tmp != EOF);printf("请输入字符:");// 1  2 回车printf("%c", getchar());  //第一个getchar()读取了123之后的回车,体现在printf("请输入字符:");中并没有换行符却换行了。printf("%c", getchar());// 读取并输出 1printf("%c", getchar());// 读取并输出 2
}

运行实例:


总结

getchar()在初次接触和使用时,大多数出错就是对于回车字符的读取。在调用时注意就会避免很多麻烦。调用前清空缓存区会是很好的解决办法。所以scanf()的优点就体现出来了,scanf()只有在格式化为"%c"时会读取回车符,但缺点也是无法读取含空格等字符的字符串并存储到字符数组中(严格意义上讲并不是字符串,可以理解为含格式化"%s"无法完整读取的字符组合,例如"gy gr 134 4353freg 32"这种中间有空格的)

C语言 getchar()函数详解相关推荐

  1. c语言memset对应java,C语言memset函数详解

    C语言memset函数详解 memset() 的作用:在一段内存块中填充某个给定的值,通常用于数组初始化与数组清零. 它是直接操作内存空间,mem即"内存"(memory)的意思. ...

  2. R语言which函数详解以及Rcpp改写

    R语言which函数详解以及Rcpp的改写 引言 which 函数的介绍 which函数的一些小例子 1 2 which函数的改进以及时间对比 引言 首先来介绍一下R语言which函数的作用:whic ...

  3. 【C语言】函数详解(入门到进阶)

    目录 前言 一.什么是函数 二.函数的构成 三.函数的调用和声明 四.函数的参数 五.函数的递归 总结 写在后面 前言 最近帮家里的小朋友整理一些学习C语言的知识点 有整体入门基础文章--[C语言]拯 ...

  4. [C语言] scanf 函数详解多组输入法和gitee 自荐

    自荐 gitee>>> C语言学习练习: C语言学习练习 上面是我的gitee C语言仓库链接,欢迎大家来看看我写的代码.!(◦˘ ³(♡ŐωŐ♡)(给大家推荐gitee(码云)这个 ...

  5. C语言strlen函数详解

    strlen函数详解 一.strlen函数简介 1.函数原型 2.注意事项 二.strlen函数模拟实现 1.计数器方式 2.递归实现 3.指针-指针实现 一.strlen函数简介 1.函数原型 si ...

  6. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  7. c语言 指针函数 详解,[NOTE-C]C语言指针详解(一)

    C语言指针让一切想法变成可能,强转和指针可以看做一项呼风唤雨的利器,但是C语言中指针应用又需要格外的小心,其更灵活的利用内存,因为不当的应用可能引起各种异常,这篇文章就是让我们一起来认识C指针,更好的 ...

  8. C语言scanf函数详解和示例

    文章目录 一.数据输入 二.断章取义 三.scanf输入 1.输入整数 2.输入字符 3.输入浮点数 4.输入字符串 5.输入多个内容 6.示例(book13.c) 四.注意事项 五.获取视频教程 六 ...

  9. c语言string函数详解

    linux kernel code :  kernel/lib/string.c strsep,strtok,strchr ,strstr ...... PS:本文包含了大部分strings函数的说明 ...

最新文章

  1. 边缘AI是内存技术发展的催化剂
  2. labview在2048中添加时间滚动条_Axure 教程:不可见滚动条的页面滚动效果
  3. Struts文件上传包含修改文件上传参数,多文件上传
  4. 原python基础概念整理_Python从头学之基础概念整理
  5. mysql自动dump脚本_MySQL--简单mysqldump脚本
  6. Flash AS3.0实例教程:构建简单的声音可视化程序(波型图)
  7. Codeforces Round #382 (Div. 2) D. Taxes 歌德巴赫猜想
  8. [转]Resource for Windows Phone 7
  9. python3.7安装opencv4.1_树莓派4的opencv4.1.0--python3.7的开发环境安装
  10. HTML5 之 FileReader(图片上传)
  11. 一种免费下载专利的方法
  12. android 安装apk 代码,Android 8.0安装apk的实例代码
  13. 【转载】APP通用测试用例大全
  14. 淘宝无货源自动群控软件一键铺货接口对接说明
  15. Default clip could not be found in attached animations list...must be marked as legacy解决办法
  16. 如何对多个文件夹进行重命名?这个方法可以批量修改文件夹名、给文件夹名加统一前缀或后缀
  17. 计算机专业怎么说才能高大上,搞笑!如何把自己的职业说的高大上
  18. 移动端天气系统--【下雨】效果之【雨滴】的实现和分析
  19. php 问卷调查,php 问卷调查结果统计
  20. python3 打包后执行报错failed to execute script ***

热门文章

  1. win10 nas搭建_零起步自建家用NAS
  2. 解决Windows10系统ping外网不通的问题
  3. visio设置图片默认大小_教大家Visio怎么随意调节图形的大小
  4. python123app_Python实现iOS APP 自动化打包
  5. docker 使用tar安装mysql_使用docker安装mysql服务
  6. 伙伴云品牌升级:logo换新,调性更潮
  7. 关于C语言的system函数用法
  8. 关于修复mp4文件损坏的过程小记
  9. 更改计算机一级密码,详细教您如何更改win10系统电脑密码
  10. 最佳实践 | 用腾讯云AI人像变换给自己一次“跨越年龄的体验”