scanf,getchar,gets知识详解

1.scanf

   scanf用于输入数据,它处理不了空格键和回车键(enter),两者其实都是字符,键盘上每一个键位都是一个字符,空格对对应'\0',回车对应'\n'。,scanf将处理不了的这两种键放入缓冲区。

缓冲区类似数据结构中的队列,一边只负责进,一边只负责出。顺序进出。

(1)当数据为单个字符时:

由于输入单个字符时,会按下一个字符键,再按下一个回车,而scanf处理不了回车键,将其放入缓冲区。所以当下一个scanf来读数据时不用输入直接读走回车键(\n),不用输入,这就造成了麻烦,代码如下:

char a, ch;
int count = 0;
while (1) 
{
	scanf("%c", &a);
	count++;
	printf("**************\n");
	printf("%d\n", count);
}
//用count的值来反映scanf执行了多少次。

 结果如下;

输入一个a和一个回车键程序执行两次,count的值变为2

 

 2.当输入为字符串时,scanf遇到空格和回车键将其放入缓冲区代码如下:

  char a[4] = "abc";
  scanf("%s", a);
  for (int i = 0; i < 4; i++)
  {
      printf("%c ",a[i]);
  }

 字符串"abc”其实是4个字符'a','b','c','\0'。'\0'是转义字符标志着字符串的结束,在屏幕上体现为占用一小段空间。

操作过程如下:

输入z, 输入空格,输入空格,按下回车。结果如下:

 由于输入字符串,所以在输入z, 输入空格,输入空格,按下回车后,在%s的作用下会自动在结尾是添加转意字符'\0'形成字符串。由于空格和回车键全部放入缓冲区不处理,所以相当于只输入了一个字符z,结尾自动加上了转义字符'\0'。它俩就改变了字符串数组中ab的值。解释了结果z   c。注意:中间的空格就是转义字符'\0'改变了b的值,z改变了a的值

2.getchar

  getchar作用是输入单个字符。它不处理回车键,处理空格,同样也是将回车键放入缓冲区。它的作用是与scanf作用在一起读取scanf留在缓冲区的回车键。防止影响下一次输入。

例如代码:

	char a, ch;
	int count = 0;
	while (1) 
    {
		scanf("%c", &a);
        getchar();//函数特点不需要传参
		count++;
		printf("**************\n");
		printf("%d\n", count);
	}

 结果如下:

 消除了缓冲区回车键的影响

 测试用例2:

 

 输入a,b程序就自动停止了,没有机会输入c。a后面读取了一个回车键(\n)所以输出结果时换了行。

 

 3.gets

只用于字符串的输入

gets 读取以任何字符开头的字符串,读取的字符串包括 空格 但是不包括 回车,以 回车 结束输入,接收 空格 和 回车,但之后会丢弃 回车 并以 \0 代替。

 

   1. int main(){
   2.char a[100];
   3. gets(a);
   4.printf("%d",strlen(a));

 结果如下:

总结:

1.scanf 忽略行开头的所有空格,并以各种格式化进行数据输入,直到遇到 空格、回车 结束输入,不接收 空格 和 回车,留在缓存区中;


2.getchar 只读取一个字符,包括 空格 但是不包括 回车,回车 会留在缓冲区中;


3.gets 读取以任何字符开头的字符串,读取的字符串包括 空格 但是不包括 回车,以 回车 结束输入,接收 空格 和 回车,但之后会丢弃 回车 并以 \0 代替;

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绵绵细雨中的乡音

感谢您陌生人对我求学之路的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值