int a
scanf("%d",&a);

 什么意思,是从键盘读取一个数字存放到a中。错,scanf和所有从键盘获取输入数据的函数都不是直接从键盘获取数据的,而是从“标准输入”获取数据的,如果标准输入没有数据,才让用户从键盘输入数据的。

当程序提示我们输入数据的时候实际上发生了这样的过程:

键盘数据----------缓冲区----------标准输入

缓冲区你可以理解为程序分配的一块内存空间,标准输入你可以理解为另外一块内存空间

你有没有发现在调用scanf输入数据的时候我们是可以编辑输入数据的,本想输入数字,结果输入了字母,可以按退格键,重新输入的,那么这些字符就被输入到了缓冲区里面了,直到按下回车之后,缓冲区的数据连同最后输入的回车一起被写到标准输入里面取了。然后scanf从标准输入读取数据。

	char ch;

	ch = getchar();
putchar(ch); ch = getchar();
putchar(ch);

看下上面这段代码,getchar意思是从标准输入获取一个字符,但是我输入的是hello 共5个字符,当我按下回车的时候,这5个字符连同回车一同被写入到了标准输入中,putchar是从标准输入获取一个字符输出,默认是第一个字符,那么自然会输出h

然后下面我又调用 getchar(),这次还要从键盘读取输入数据吗? 不需要,是直接从标准输入读取的数据,由于标准输入现在是hello\n这几个字符, getchar获取的获取的是e这个字符,然后调用putchar输出e。所以最后的结果是he。

我写了一个程序来把标准输入的数据放到输入中。

	char ch;
char test[10] = {0};
int x=0;
while(x<6)
{
ch = getchar();
test[x] = ch;
x++;
}

运行结果:

可以看到标准输入的最后一个字符是\n

getchar scanf这些输入函数并不限制你输入字符的个数,实际上你想输入多少个字符都可以,只是当你按下回车的时候,所有缓冲区的数据被写入到标准输入里面,然后getchar从标准输入从里面读一个字符,scanf从标准输入读一个数字、一个字符、一个字符串。

以前一直觉得getchar调用一次就从键盘输入一次数据,并不是这样的。

c语言标准输入和scanf的关系的更多相关文章

  1. C语言中关于scanf函数的用法

    scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...

  2. C语言——常用标准输入输出函数 scanf(), printf(), gets(), puts(), getchar(), putchar(); 字符串拷贝函数 strcpy(), strncpy(), strchr(), strstr()函数用法特点

    1 首先介绍几个常用到的转义符 (1)     换行符“\n”, ASCII值为10: (2)     回车符“\r”, ASCII值为13: (3)     水平制表符“\t”, ASCII值为 9 ...

  3. 关于C语言的输入-scanf、gets、getchar、getch、getline

    找工作刷题,重拾C语言,发现对键盘输入掌握很生疏,现总结各类输入函数使用方法和注意事项如下. 1.scanf("格式说明",变量地址列表) scanf("%s" ...

  4. 在C语言中使用scanf语句时遇到的问题总结

    在使用visual studio2013编写c语言代码时,遇到了这样的几个小问题,进行如下的总结. 1, 关于使用scanf语句报错的解决方案1 #include <stdio.h> in ...

  5. 重学C语言 -- printf,scanf

     printf();    用来显示格式串的内容          注意: 参数不可以换行,否则会出一个警告.       格式串中占位符比表达式数量多     会显示一个无意义值 格式串中占位符比表 ...

  6. C语言gets雨scanf函数的用法

    /*1.不同点: scanf不能接受空格.制表符Tab.回车等: 而gets能够接受空格.制表符Tab和回车等: 2.相同点:  字符串接受结束后自动加'\0'. 使用scanf("%s&q ...

  7. C语言输入语句scanf与fgets linux下

    1.测试使用scanf的一个例子: #include "stdio.h" #include "string.h" int main() { char name[ ...

  8. c语言学习笔记 scanf和printf格式的问题

    int a =0; int b =0; scanf("%d %d",&,&b); 上面这种和下面这种哪种对? int a =0; int b =0; scanf(& ...

  9. C语言基础之scanf函数的使用

    0.自己实际遇到的坑 Mac下如果用标准键盘,使用scanf输入时不能用小键盘上的回车,否则系统不能很好的识别. 1.scanf函数的基本使用 1: // 定义一个变量,用来保存用户输入的整数 2: ...

随机推荐

  1. 【备忘录】Sublime Text编辑器如何在选中的多行行首增加字符串

    如题:上面的代码,想在每一行的开头加上一个字符 * 如下: 操作步骤如下: 1.选中要操作的行(我这里Ctrl+A) 2.Ctrl+Shift+L (待操作状态) 3.方向键←   (操作这步骤后,可 ...

  2. golang的slice作为函数参数传值的坑

    直接贴代码 func sliceModify(slice []int) { // slice[0] = 88 slice = append(slice, ) } func main() { slice ...

  3. cpp分解质因数

    原理有点像埃氏筛. #include <stdio.h> #include <iostream> #include <stdlib.h> using namespa ...

  4. Wdatepicker日期控件的使用指南

    示例2-3-1 起始日期简单应用 示例2-3-2 alwaysUseStartDate属性应用 示例2-3-3 使用内置参数 示例 2-4-1: 年月日时分秒 示例 2-4-2 时分秒 示例 2-4- ...

  5. 20181106_线程之异常_取消_变量_安全Lock

    一. 线程的异常处理: try { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List& ...

  6. MySql——查询题目练习

    本次查询我们基于这几张表查询 ***********查询练习********** 1. 查询Student表中的所有记录的Sname.Ssex和Class列. select sname,ssex,cl ...

  7. 如何做一款自己的Android App

    转自:http://www.cnblogs.com/hubcarl/p/4030884.html 正在做App,后续补充: 概述:以我开发的一款编程学习的App[编程在线]为例讲讲如何做一款自己的An ...

  8. cocos2dx切换播放的动画

    版本:cocos2dx 2.2.6 IDE: VS2012 语言:C++98 美术资源一共有两段动画的序列帧,一个是手绘马行走图,一个是分子人行走图. 程序要实现的目的就是在同一个位置,点击按钮可以实 ...

  9. Disconf实践指南:改造篇

    上一篇文章Disconf实践指南:使用篇介绍了如何在项目中应用disconf,虽然实现了分布式配置的实时刷新,但是我们希望能够去除所有的配置文件,把配置都交给disconf管理,本地只需要实现配置监听 ...

  10. 「小程序JAVA实战」开发用户redis-session(40)

    转自:https://idig8.com/2018/09/05/xiaochengxujavashizhankaifayonghuredis-session39/ 接下来我们需要在我们的项目里面配置下 ...