C语言scanf 和 getchar函数详解

1.scanf函数

1.1scanf函数介绍

 

scanf函数:从标准输入流中读取数据,输入到指定位置的参数中去。标准输入流就是键盘。 

scanf:通过键盘给程序中的变量赋值。

参数:.....  可变参数,参数的个数是可变的。

返回值类型为整型:

1. 正整数,表示正确输入参数的个数,读取成功返回读取成功参数的个数。
例如执行 scanf(“%d %d”, &a, &b)。

输入6 6,则正确返回2(输入了两个变量)。

输入3 ;4,则可以正确输入a,无法输入b,即正确返回1(输入了一个变量)

2.“0”
表示用户输入不匹配,无法正确输入任何值.(比如上例输入“ a6 6”)

3.EOF
这是在 stdio.h 里面定义的常量,意思是end of file (文件结束标志)(通常值为-1),表示输入流已经结束。


1.2scanf函数用法

1.2.1 常规正确用法

scanf(“输入格式控制符”,要输入到指定变量的地址);

在通常情况下,我们不希望某个值是由我们程序员指定的,而是在程序运行中由用户从键盘输入的,这更能满足在日常使用时用户的需要,提高我们程序的灵活性

nt main()
{
	int a= 0;;
	printf("请输入一个数:\n");
	scanf("%d", a);
	
	return 0;
}

数组名就是首元素的地址,如果是一般变量则需要在其前面加上&(取地址符)

注意我们需要对scanf函数理解的两个点:

(1)我们从键盘输入的全部都是字符。比如从键盘输入 125,它表示的并不是数字 125,而是字符 ‘1’、字符 ‘2’ 和字符 ‘5’。
操作系统在接收键盘数据时会将它当成字符来接收。这时就需要用“输入控制符”把它转化成相应的内容(如%d 是有符号十进制数 %s是字符串)。

上面代码中的%d就是要将从键盘输入的这些合法的字符转化成对应的十进制数字。比如经过 %d 转化之后,字符 125 就是数字 125 了。

(2)&是一个取地址运算符,&加变量名表示“该变量的地址”,所以&n就表示变量 n 的地址。又称为“取地址n”,相当于将数据存入以变量 n 的地址为地址的变量中(即存入变量n的地址中)。也就是把转化后的数字125放到变量 n 中

总的来说
scanf 语句的意思就是:从键盘上输入字符 125,然后%d将这三个字符转化成十进制数 125,“&n” 找到变量 n 的地址,把数字 125 放到以变量 n 的地址为地址的变量中,即变量 i 中,所以最终的输出结果就是n=125。

1.2.2   注意在scanf中,所有的“非输入控制符”都要原样输入

比如:

  • 这种输入方法必须满足原样输入,当用户使用时,但凡输入的和你设置的格式有一点不同都不行,哪怕只是多或者少了一个空格或者符号都是错误的,所以不建议这种写法,可以向1.2.1上面的写法一样,用printf函数进行提示,是比较好的推荐。

1.2.3 多个变量赋值

通过键盘给多个变量赋值与给一个变量赋值其实是一样的。比如给两个变量赋值就写两个 %d,然后“输入参数”中对应写上两个 “取地址变量” ;给三个变量赋值就写三个 %d,然后“输入参数”中对应写上三个 “取地址变量” 

从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分给不同变量赋的值。而且空格、回车或 Tab 键的数量不限。一般使用一个空格即可。

# include <stdio.h>
int main(void)
{
    int m, n;
    scanf("%d%d", &m, &n);
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

1.2.4 利用scanf返回值实现多组输入 

1. 正整数,表示正确输入参数的个数,读取成功返回读取成功参数的个数。
例如执行 scanf(“%d %d”, &a, &b)。

输入6 6,则正确返回2(输入了两个变量)。

输入3 ;4,则可以正确输入a,无法输入b,即正确返回1(输入了一个变量)

当正确读到两个整型,就可以执行循环,实现两个数相乘。当读到的参数格式不对,或者读取参数为1时,不进入循环。 

但是使用整数返回值实现多组输入的时候几个问题值得一提。

2.EOF
这是在 stdio.h 里面定义的常量,意思是end of file (文件结束标志)(通常值为-1),表示输入流已经结束。这个放在1.3中讲解。

1.3,补充讲解scanf的读取规则

1.4 补充scanf函数的格式控制符

%d整数(十进制打印整数)

%o整数(八进制)

%x整数(十六进制)

%f小数(单精度)

%lf小数(双精度)

2.getchar()函数 

2.1 getchar函数介绍

函数作用:从缓冲区读取一个字符

返回值:int类型

             读取成功,返回字符的ACSII码值

             读取失败,返回EOF (end of file   文件结束的标志   -1)

 

因为getchar每次只读取一个字符,所以,只打印a,如果要都打印要使用循环。 

 这里也可以看出get插入是会读取空格和回车的。

2.2两个输入函数的经典问题代码。

我们来看下面一段代码,我们想实现输入密码,然后输入‘Y’表示确认密码成功,否则就确认失败。

int main()
{
	char password[20] = { 0 };
	printf("请输入,密码:\n");
	scanf("%s", password);
	printf("请确认密码,输入Y确定,输入N表示失败:\n");
	char input = 0;
	scanf("%c", &input);//scanf是从输入缓冲区里面拿数据,当缓冲区里面有数据就直接拿出,此时缓冲区有一个反斜杠n,scanf只读取到\n之前
	
	//input = getchar();
	if (input == 'Y')
	{
		printf("密码确认成功\n");
	}
	else
	{
		printf("密码确认失败\n");
	}
	return 0;
}

但是,当我们运行发现我们都还没有输入Y或者N来进行确定或者否定,系统直接自己就进行否定了这是为什么呢。这里就可以再看看两个函数的读取规则。 

然后我们可以分析代码

如何解决呢?

我们知道错误原因就是因为缓冲区里面还有一个\n,那我用一个getchar函数提取了,清楚掉缓冲区不就好了嘛,看效果。 

 

看似解决了问题,但是又出现了新的情况,请看:

错误的原因:
scanf用%s读取的时候读取到空格就结束了,所以只从缓冲区里面拿走了123  缓冲区里面还有

   abc,但是一个getchar只清除一个空格,所以a 给了input导致错误,那么getchar就需要一直执行到读到回车才是完美的解决所以:

附上源码,大家可以体验。

int main()
{
	char password[20] = { 0 };
	printf("请输入,密码:\n");
	scanf("%s", password);
	printf("请确认密码,输入Y确定,输入N表示失败:\n");
	char input = 0;
	while (getchar() != '\n')
	{
		;//空语句
	}
	scanf("%c", &input);//scanf是从输入缓冲区里面拿数据,当缓冲区里面有数据就直接拿出,此时缓冲区有一个反斜杠n,scanf只读取到\n之前
	
	//input = getchar();
	if (input == 'Y')
	{
		printf("密码确认成功\n");
	}
	else
	{
		printf("密码确认失败\n");
	}
	return 0;
}

以上就是本期所有内容,后续随着学习的深入,我会对博客的不足进行补充,也欢迎大家批评指正。 

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值