scanf的读取规则
scanf("$s",name) 当输入的值为miao guicheng 是scanf只读取到了miao 注意:输入的时候不知道怎么输入制表符和换行符
scanf当遇到空格,制表符(\t \v),换行符(\n)就不会再读取了
#define 宏定义
#define可以定义常量字符和字符串 前者使用单引号后者使用双引号
const
限定符,限定一个变量为只读权限,无法修改变量的值
printf和scantf函数
转换转换说明
其中比较常见的有:
%c:单个字符
%f:浮点数,十进制
%s:指针
注意:因为printf使用%来标识转换说明,因此打印%就成了问题,解决的办法就是使用
二个%来打印%
printf的转换说明修饰符
几种比较常用的说明修饰符:
数字:最小的字段宽度,如果该字段不能容纳打印的数字或者字符串,系统会使用更高的字段
.数字:对于%e %E%f,表示小数点右边数字的位数
对于%G和%g,表示有效数字最大位
对于%s,表示打印字符的最大数量
float参数的转换
对于浮点数类型,有double和long double的类型转换说明却没有float的类型转换说明,这是因为float类型的值会自动转换成double类型
printf的标记
常用的标记:
-:打印左对齐
+:有符号值若为正,则前面显示正号,若为负则前面显示减号
空格:如“% 6.2f”:有符号值若为正则前面显示空格,若为负,则前面显示负号
0:用0代替空格填充
转换不匹配:
#inclede <stdio.h>
#define PAGES 336
#define WORDS 65618
int main()
{
short num=PAGES;
short mnum=-PAGES;
printf(“num as short and unsigned short :%hd %hu\n”,num,num);
printf("-num as short and unsigned short :%hd %hu\n",mnum,mnum);
printf(“num as int and char short :%d %c\n”,num,num);
printf(“word as int short and char short :%d %hd %c\n”,words,words,words);
return 0;
}
336 336
-336 65200
336 p
65618 82 R
第一行可以看出,对于一个正数来说,用%hd和%hu是一样的
第二行可以看出,对于一个负数来说,这二个打印结果是不一样的,原因是,计算机是以二进制的补码的形式存放的,对于有符号数,符号是最高位,负数是1,所以转换成无符号位数时就变成一个非常大的数字了,因为short是二个字节,故65525表示-1,65524表示-2所以65200表示336
第三行可以看出以%d打印没有什么影响,因为int是4个字节,低位转换成高位没有影响,但是转换成char类型就发生了截断,336对应的二进制数是 00000001 01010000,取第八位01010000,对应十进制位80,R的ASIIC为80故打印出R
int main()
{
float n1=3.0;
double n2=3.0;
long n3=2000000000;
long n4=1234567890;
printf("%.1e %.1e %.1e %.1e\n",n1,n2,n3,n4);
printf("%ld %ld\n",n3,n4);
printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
return 0;
}
3.0e+00 3.0e+00 3.1e+46 1.7e+266
2000000000 1234567890
0 1074266112 01074266112
注意:%e浮点数,e计数法,打印的类型为double类型,一次读取8位
第一行说明整数不能转换成浮点数,或者说打印出来的数没有什么意义
第二行说明%ld可以正确打印出n3和n4
第三行确并么有打印出n3,n4这是什么原因呢,这是因为%ld每次读取二个字节,float又转换成了8个字节,故打印的四个数分别是n1和n2的前半部分和后半部分如果再写二个%ld就可以打印出来n3和n4
sqrt:求平方根
printf的返回值:
printf的返回值是打印字符的个数,如果有输出错误,返回一个负数