最近学习了数据结构中的线性表,然后就像做一个学生成绩管理系统的小程序,不过在写数据输入的时候,遇到了一些个问题,然后上网给google了一下,发现scanf(),这个函数是相当的复杂啊!于是将搜索到的资料,与自己的一些实例记录下来,做个参考!
scanf()函数的用法:
scanf函数,与printf函数一样,都被定义在stdio.h里,即按用户指定的格式从键盘上把数据输入到指定的变量之中,其关键字最末一个字母f即为“格式”(format)之意。scanf函数的一般形式为:
scanf(“格式控制字符串”,地址表列);
格式化字符串包括以下三类不同的字符
格式化说明符:格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。
1.格式化说明符:
%d
从键盘输入十进制整数
%o
从键盘输入八进制整数
%x
从键盘输入十六进制整数
%c
从键盘输入一个字符
%s
从键盘输入一个字符串
%f
从键盘输入一个实数
%e
与%f的作用相同
附加格式说明字符表
L
输入"长"数据
H
输入"短"数据
M
指定输入数据所占宽度
*
空读一个数据
2.空白字符:
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。
3.非空白字符:
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
地址表是需要读入的所有变量的地址,而不是变量本身。这与printf()函数完全不同,要特别注意。各个变量的地址之间同","分开。
例如:
#include <stdio.h>
void main()
{
int i, j;
printf("i=?,j=?\n");
scanf("%d, %d", &i, &j);
printf("i=%d,j=%d",i,j);
}
当输入1,2时:
此时,scanf()函数先读一个整型数,然后把接着输入的逗号剔除掉,最后读入另一个整型数。如果","这一特定字符没有找到,scanf()函数就终止。
当输入1(空格)2时:
若参数之间的分隔符为空格,则参数之间必须输入一个或多个空格。
使用scanf函数时应该注意的问题
1.对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
例如:
#include <stdio.h>
void main()
{
char *p, str[20];
p = new char[20];
scanf("%s", p);
scanf("%s", str);
printf("%s\n", p);
printf("%s\n", str);
}
2.可以在格式化字符串中的"%"各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。如上例中若规定只能输入10字符给字符串指针p,则第一条scanf() 函数语句变为:scanf("%10s", p);程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf("%s", str)就会从第11个字符开始读入
3.scanf()函数中没有精度控制。如: scanf("%.2f",&a); 是非法的。
4.scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
5.在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:scanf("%c%c%c",&a,&b,&c);
输入为:
d e f
则把'd'赋予a, ' (空格)'赋予b,'e'赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把' '作为下一个字符送给b。
只有当输入为:def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,
如 scanf ("%c %c %c",&a,&b,&c);则输入时各数据之间可加空格。
scanf()的返回值
scanf的返回值有后面的参数决定
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
也就是说scanf()的返回值等于成功读入参数的个数
且返回值为int型.如果遇到错误或遇到end of file,返回值为EOF。