关于C语言中scanf()的相关问题

来源:互联网 发布:淘宝达人认证大v 编辑:程序博客网 时间:2024/05/16 04:15

最近学习了数据结构中的线性表,然后就像做一个学生成绩管理系统的小程序,不过在写数据输入的时候,遇到了一些个问题,然后上网给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。