Scanf函数是一个标准库函数,其函数原型在头文件“stdio.h”中,与printf函数相同,c语言也允许在使用scanf函数之前不必包含stdio.h文件。
scanf(“格式控制字符串”,地址列表);
一、格式字符串
一般形式:%[*][输入数据宽度][长度]类型
其中: [ ]中 的项为任意项。
1)、类型:
格式 字符意义
d 输入十进制整数
o 输入八进制整数
x 输入十六进制整数
u 输入无符号十进制整数
f或e 输入实型书(小数形式或指数形式) printf( ) %f输出 保留6位小数
c 输入单个字符
s 输入字符串
2)、“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
如:scanf(“%d%*d%d”,&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b
3)、宽度: 用十进制整数制定输入的宽度(即字符数)
如:scanf(“%5d”,&a);
输入:12345678 a的最终结果为 12345
scanf(“%4d %4d”,&a,&b);
输入:12345678 将把1234赋予a,把5678赋予b
4)、长度:长度格式符为l和h,l表示输入长整形数据(如%ld)和双精度浮点数(如 %lf)。H表示输入短整型数据。(%hd %hf)
二、使用scanf() 必须注意下面几点:
1)、 scanf 函数中没有精度控制,如:scanf(“%5.2f”,&a); 是非法的。不能用此语句输入小数为2位的实数。
2)、在从键盘输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如 对”%d“输入”12A“时,A即为非法数据)时即认为该数据结束。
3)、在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。【总之,程序在读入字符型数据(整型等类型无所谓)时,空格也被认为是字符数据】
例如:
scanf(“%c%c%c”,&a,&b,&c);
输入为:d e f 时
则把d 赋予 a ;把空格赋予b;把e 赋予 c
只有当输入为:def时,
才能把d赋予a,把 e赋予b,f赋予c
如果在格式控制中加上空格作为间隔,
如scanf(“%c %c %c”,&a,&b,&c);
则输入各数据之间可加空格
Demo1: 将小写字母转换为大写字母
<span style="font-size:18px;"> /*小写字母转换为大写字母*/
#include <stdio.h>
void main()
{
char a,b,c;
printf("请输入三个小写字母。。。\n");
scanf("%c %c %c", &a, &b, &c);
printf("%c %c %c\n%c %c %c\n", a,b,c,a-32,b-32,c-32);
printf("%d,%d", a, a-32);
}</span>
<span style="font-size:18px;"> #include <stdio.h>
/*输出各种数据类型的字节长度*/
void main()
{
int a;
long b;
float c;
double d;
char e;
printf("int: %d\nlong: %d\nfloat: %d\ndouble: %d\nchar: %d\n",sizeof(a),
sizeof(b),sizeof(c),sizeof(d),sizeof(e));
}</span>
<span style="font-size:18px;"> #include <stdio.h>
#include <math.h>
void main()
{
double a,b,c,area,s;
printf("请输入三角形三边长:\n");
scanf("%lf,%lf,%lf",&a,&b,&c);
s=1.0/2*(a+b+c);//此处不能1/2,会取整变成零 s=(a+b+c)/2也行,因为分子是double型,会强转为double型
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=%2.2g,b=%2.2g,c=%2.2g,s=%2.2g\n", a, b, c, s);
printf("area= %2.2f\n", area);
}</span>
Demo4: 求ax^2+bx=c=0方程的根,a,b,c由键盘输入,设b^2-4ac>0
<span style="font-size:18px;">#include <stdio.h>
#include <math.h>
void main()
{
double a,b,c,p,q;
printf("input...\n");
scanf("%lf,%lf,%lf",&a,&b,&c);
p=-b/(2*a);
q=sqrt(b*b-4*a*c)/(2*a);
printf("x1=%5.2f,x2=%5.2f\n", p+q, p-q);
}</span>
当用double类型时,一定要用%lf 格式。
14-08-27新增
关于此题目,自己竟然想得极其复杂!采用数组装载26个字母,如输出小写字母:printf("%c",ch[cin-97]);
其实,无论字符转数字,还是数字转字符,都可以采用直接输出的方式!控制输出格式就行
<span style="font-size:18px;">#include <stdio.h>
int main(void)
{
int cin;
scanf("%d",&cin);
printf("%c\n",cin);
return 0;
}</span>