1.(补充)浮点数上溢,float型超过精度,后面的数直接扔掉;下溢,1/(很大的数),得0.000000.
2.C中的字符串一定以空字符结束:\0。故"x"和'x'不同,后者为char类型,前者是字符串,实际包含'x'和\0.
3.数组是同类型数据元素的有序序列。char name [40]:可以放40个char变量
4.在头文件下写#define 符号常量 “常量内容”或数字常量,常用全大写来定义符号常量或加上c_或k_。在主函数块中用const来定义只读变量。
5.在数组内,sizeof报告数组定义时的大小,而strlen()函数{必须使用头文件<string.h>}计算数组内字符串的实际长度,还不包括\0,所以非数组内,sizeof的值比strlen大1
6.%%用于打印%
7.修饰转换说明时 .2 规定n位小数,后面的数四舍五入,但上下溢时后面的数直接丢掉。.n还可以表明保留n个字符。
8.修饰符(写在%和数据类型之间):①+,用于显示正负号;②-,使打印字符左对齐(默认右对齐),一般用于使格式规整,和规定字宽同时使用;③空格,正数空一格,负数显示负号;④0,把留出字宽的空格用0填满,但和精度一起出现时,直接忽略;⑤*修饰符,printf函数中相当于一个转换说明,可以在参数中定义*的数值,在后面的参数中按顺序写出;但在scanf函数中相当于跳过此次扫描。
9.负数用%ud表示时,0~最大范围值,前半部分表示正数,后半部分表示负数,最大值+负数;大于255的数用%c表示时,n/256…x,x的ascⅡ码即为结果;%c是一个例子,当数过大时,余数可能位于unsigned范围内,此时打印一个负数。
10.混淆整型和浮点型:long型用转换说明%e,因为%e用的double型,有8位,而long只有4位,计算机会把邻近的4位共8字节一起来组合成浮点型,所以值没有意义。float在printf()里面被转换成double型。用%ld去打印double型数据也会出错,但后来的原本的long型不会出错,但书上说会出错????疑惑???
11.printf,scanf函数可以有返回值,printf返回包含空白在内的字符数,scanf返回项数,scanf函数里面有几个转换说明就算几项。
int rv; rv = printf("Hello \n\t");
有两个含义:打印字符串;给rv赋值;
12.printf字符串太长,可以在换行处写\;可以写""分成两个字符串的拼接;可以写成两个printf。\后面的空格,用于对齐也会加入原先字符串中。
13.scanf函数:注意&的存在与否;如转换说明之间用,隔开,则用户输入时严格遵守,空格不影响;只把%f,%e,%g用于float型,double用l修饰,long double用L修饰。
14.scanf函数读取数据时,只要对应的数据,遇到非或宽度到达就停止;第一个字符不对输入0。下一个scanf从停止处开始读取。但同时第一个第二个出错,第一个输入0,第二个输入1,为什么???
15.scanf函数中,空格只对%c类型产生影响。scanf("%c", &a)或("%c ",&a)时,即空格在转换说明后,输入空格在输入几个字母,无法跳过此空格;scanf(" %c",&a)时则可以跳过从第一个字母开始读取。
编程练习
4.2
#include <stdio.h>
#include <string.h>
int main(void)
{
char age[40],xp[40];
printf("请输入您的名和姓:");
scanf("%s %s",age,xp);
printf("您的输入是\"%s %s\"\n",age,xp);
printf("您的输入是\"%20s %20s\"\n",age,xp);
printf("您的输入是\"%-20s %-20s\"\n",age,xp);
int d,f;
d = 3 + strlen(age);
f = 3 + strlen(xp);
printf("您的输入是\"%*s %*s\"",d,age,f,xp);
return 0;
}