scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。scanf函数的一般形式为:scanf(“格式控制字符串”, 地址表列)
我们从以下几个方面讨论这段代码:
1、scanf格式控制字符串
格式字符串的一般形式为: %[*][输入数据宽度][长度]类型
(1)类型
(1)类型
格式 | 字符意义 |
d | 输入十进制整数 |
o | 输入八进制整数 |
x | 输入十六进制整数 |
u | 输入无符号十进制整数 |
f或e | 输入实型数(用小数形式或指数形式) |
c | 输入单个字符 |
s | 输入字符串 |
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
#include<stdio.h>
int main(void)
{
scanf("%d %*d %d",&a,&b);
return 0;
}
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
(3)宽度
#include<stdio.h>
int main(void)
{
scanf("%5d",&a);//输入12345678只把12345赋予变量a,其余部分被截去。
scanf("%4d%4d",&a,&b);//输入12345678将把1234赋予a,而把5678赋予b。
return 0;
}
(4)长度
h表示按短整型量输出,l表示按长整型量输出。
1》%L修饰符(注意大写的L):和浮点转换说明符一起使用,表示一个long double值。
示例:“%Lf”和“%10.4Le”
注:%l的修饰符(小写的l):和整数说明符一起使用,表示一个long int 或者unsigned long int 类型值。
示例:“%ld”和“%8lu”。
2》%h修饰符:和整数转换说明符一起使用,表示一个short int 或者 unsigned short int 类型数值。
示例:“%hu”、“%hx”和“%6.4hd”
1》%L修饰符(注意大写的L):和浮点转换说明符一起使用,表示一个long double值。
示例:“%Lf”和“%10.4Le”
注:%l的修饰符(小写的l):和整数说明符一起使用,表示一个long int 或者unsigned long int 类型值。
示例:“%ld”和“%8lu”。
2》%h修饰符:和整数转换说明符一起使用,表示一个short int 或者 unsigned short int 类型数值。
示例:“%hu”、“%hx”和“%6.4hd”
2、地址列表
例如:&a、&b分别表示变量a和变量b的地址。
这个地址就是编译系统在内存中给a、b变量分配的地址。
这个地址就是编译系统在内存中给a、b变量分配的地址。
在赋值表达式中给变量赋值,如:
a=567;
a为变量名,567是变量的值,&a是变量a的地址。但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。
a=567;
a为变量名,567是变量的值,&a是变量a的地址。但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。
这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
3、注意事项
(1)scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
(2)scanf中要求给出变量地址,如给出变量名则会出错。如 scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
(3)在输入多个数值数据时,若格式控制串中没有非格式字符作输入,数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
(4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
#include <stdio.h>
int main(void)
{
char a,b;
printf("input character a,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
return 0;
}
由于scanf函数"%c%c"中没有空格,输入M N,结果输出只有M。而输入改为MN时则可输出MN两字符。
4、实例
输入三个小写字母,输出其ASCII码和对应的大写字母。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char a,b,c;
printf("请用户输入三个小写字母,输入时字母之间使用空格隔开:");
scanf("%c %c %c",&a,&b,&c);
printf("%c %c %c相对应的ASCII码值为:%d %d %d\n",a,b,c,a,b,c);
printf("%c %c %c相对应大写字母为:%c %c %c\n",a,b,c,a-32,b-32,c-32);
system("pause");
return 0;
}