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

被折叠的 条评论
为什么被折叠?



