最近阅读C语言著作《c和指针》,做下笔记。
while(scanf("%d",&b)==1)
{
}
这种scanf的用法,还是第一次看见,所以又去重看了一次scanf();
scanf()
是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中
#include<stdio.h>
int
scanf(“格式控制字符串”, 地址表列);
1.返回值是一个int型,这个值代表:函数成功转换并储存于参数中的个数。
scanf(“%d”, &a); 返回值为 1
scanf(“%d%d”, &a,&b); 返回值为 2
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF(在stdio.h里定义EOF这个常量值,用于提示文件结尾)EOF
2.格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。
格式字符串的一般形式为:
%[*][输入数据宽度][长度]类型
scanf(“ %[*][输入数据宽度][长度]类型”, 地址表列);
(1)*表示读入的数据将被舍弃。带有*的格式指令不对应可变参数列表中的任何数据。
例: scanf("%d %*d %d",&a,&b);
当你输入 3 4 5时,3赋值于a,4将不读取,5赋值于b;
(2)[输入数据宽度]:以一个非零的十进制整数形式出现。表示该格式指令最多读入的字符数。
例: scanf("%5d",&a);
输入12345678只把12345赋予变量a,其余部分被截去。
scanf("%5d%4d",&a,&b);
输入123456789将把12345赋予a,而把5678赋予b
(3)[长度]:长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。
(4)类型
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或e 输入实型数(用小数形式或指数形式)
c 输入单个字符
s 输入字符串
3.&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址[2] ,是一个右值(即在赋值号右边)。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
你可以输出一下看看结果
printf("%d",&c);
64876126487612
4.注意事项
(1)在高版本的 Visual Studio 编译器中,scanf 被认为是不安全的,被弃用,应当使用scanf_s代替 scanf。
(2) 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上"&"操作符。
数组名就是数组的首地址,因此不用加&;
(3) scanf函数中没有类似printf的精度控制
scanf("%1.2f",&a);这种是非法的。不能企图用此语句输入小数为2位的实数。
(4) scanf中要求给出变量地址,如给出变量名则会出错.
scanf("%d",a); 非法
(5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
scanf("%d,%d,%d",&a,&b,&c);
其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为:a=5,b=6,c=7。
(6) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符
scanf("%c%c%c",&a,&b,&c);
输入abc;没问题
若你输入a b c;scanf会读取a 空格 b
用scanf("%c %c %c",&a,&b,&c);则不会发生问题。
以上例程和概念均可在C语言中文网找到:点击打开链接