scanf函数读取原理及某个问题的解决办法

本文介绍了C语言中scanf函数的使用方式,包括如何输入字符、字符串和数值类型的数据。同时,文章指出scanf函数在读取数据时会受缓冲区影响的问题,当遇到空格或回车符时会停止读取。为了解决这个问题,提出了使用getchar()函数清空缓冲区的方法,确保后续输入的正确性。

        scanf函数是C语言初学者经常使用的一种用于键盘输入的标准库函数,我们可以通过scanf函数输入字符,字符串,整数,浮点数等多种类型的参数,对于像我这样的初学者来说是一个简单友好易上手的函数。

1.scanf函数输入数据的方式

scanf在使用前需要引用标准输入\输出头文件<stdio.h>:

#include <stdio.h>

       scanf函数只能读取数据的地址,直接输入数据本身会导致函数无法使用,需要使用取地址操作符&将数据地址取出,作为scanf函数的输入参数,才能正常输入数据:

int main()
{
	int a = 0;
	
	printf("请输入一个整数:>");
	scanf("%d", a);//err - 应改为scanf("%d", &a);

	return 0;
}

        在用数组存储字符或者字符串时,数组名本身就是地址,因此不需要使用取地址操作符&就能正常输入:

int main()
{
	char arr1[20] = { 0 };
    char arr2[] = { 0 };
	
	printf("请输入一个字符串:>");
	scanf("%s", arr1);
    printf("请输入一个字符:>");
    scanf("%c", arr2);

	return 0;
}

2.scanf函数读取数据的缺陷以及解决办法

       当我们在键盘上输入数据时,数据会先保留在缓冲区,按下回车输入'\n',scanf函数将会读取缓冲区的数据,当scanf函数读取到空格符或者'\n'回车符时,就会停止读取,此时缓冲区将会留下空格符之后的数据或者'\n'回车符,将会影响后续的数据输入,比如下段代码:

int main()
{
	char password[20] = { 0 };
	char arr[20] = { 0 };
	
	printf("请输入一个字符串:>");
	scanf("%s", password);
	printf("请输入一个字符串:>");
	scanf("%s", arr);

	printf("%s\n", password);
	printf("%s\n", arr);

	return 0;
}

        这段代码中,如果第一次输入的是"123 456",scanf函数会将"123"提交给password数组,第二个scanf函数会直接读取缓冲区保留下来的"456\n"字符串,将"456"提交给arr数组,并回车,使得无法正常输入arr数组。

       想要解决这个问题,可以使用getchar()字符输入函数。getchar函数是单字符输入函数,返回值为整型,每次只能输入1个字符,和scanf函数一样,getchar函数同样是读取缓冲区的数据,于是可以通过getchar函数清空缓冲区:

void empty()
{
	int ch = 0;
	while ((ch = getchar()) != '\n') {
		;
	}
}

       while循环每次进入判断部分时,getchar函数都会将缓冲区的一个字符提交给ch,直到getchar函数读取到'\n'回车符时,while循环判断不通过,循环停止,同时也成功将缓冲区的字符清空,实现输入空格是正常使用第二个scanf函数输入数据。

int main()
{
	int arr1[20] = { 0 };
	int arr2[20] = { 0 };

	scanf("%s", arr1);
	empty();
	scanf("%s", arr2);

	printf("%s\n", arr1);
	printf("%s\n", arr2);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值