1.字符串是一个或多个字符序列。字符串常量用双引号括起来“abc”,字符常量用单引号括起来‘’。
2.数组是同一类型的数据元素的有序序列。数据元素在内存中是连续存储的。
C中没有为字符串定义专门的变量类型,而把它存储在char数组中。
C的字符串存储通常以空字符‘ ’结束。空字符不是数字0,而是ASCII码为0的非打印字符,用来标记字符串的结束。空字符的存在意味着,char数组长度必须比要存储的字符数多1。
char name[10];//声明了一个长度为10的字符数组。
#define NAME "gaotian"
scanf("%s",name);
printf("%s,%s",name,NAME);
3.scanf(),%s开始读取输入之后,会在遇到第一个空白字符(空格,制表符 ,换行符 )处停止读取。
4.字符串和字符的区别
字符‘x’是基本数据类型。字符串“x”是衍生数据类型char数组。“x”其实包含两个字符,‘x’和‘ ’。
5.sizeof()运算符以字节为单位给出数据或类型的大小。strlen()函数以字符为单位给出了字符串的长度。对于同一个字符串常量,sizeof会把‘ ’计算在内,因为它也占了内存,而strlen不会。
6.符号常量
程序中需要用到常量时,应使用符号常量,一是可读性高,二是方便修改。
四种方式:
-声明一个变量,再赋值为所需的常量。
int age=12;
-预处理命令定义符号常量(#define 符号名 常量值)
注意:
末尾没有分号;不属于C语句
符号名通常全大写
编译时,符号名后面的所有内容将被用来替换符号名出现的地方
这样定义的常量被称为明显常量。
#define NAME “gaotian”
#define AGE 12
-const修饰符
将变量声明为只读,可以读取用于显示和计算,不能被修改。
const int AGE = 12;
-枚举类型enum
7.C头文件limits.h和float.h中提供了关于了整型和浮点型大小限制的详细信息。定义了一系列的明显常量。
8.printf()-读取,解释,转换(数值转换成字符串文本),打印
printf(),scanf()称为输入/输出函数或I/O函数。互为逆操作。
printf(),scanf()都是有了控制字符串(前者是要打印的字符和转换说明符;后者是格式字符串(转换说明符,普通字符))和参数列表(前者是变量,常量,表达式;后者是指向变量的指针)。
printf()打印的是字符串文本,scanf()接收的也是字符串文本(即键盘输入的是字符串文本)。
参数列表中变量的类型决定数据存储的方式。控制字符串中的转换说明符决定数据读取的方式,指定数据显示的形式。
注意:格式说明符和变量的个数和类型必须一一对应。
printf()中的转换说明符:
%a,%A 浮点数,十六进制数,p-计数法
%e,%E 浮点数,e-计数法
%f 浮点数,十进制计数法
%g,%G 根据数值不同,自动选择%f,%e,%E。%e,%E在指数小于-4,大于等于精度时使用。
%c 一个字符
%s 字符串
%p 指针
%d ,%i 有符号十进制整数
%u 无符号十进制整数
%o 无符号八进制整数
%x,%X 无符号十六进制整数
%% 打印一个%
printf()中的修饰符(转换说明符的修饰符):
- 左对齐
+ 有符号的值若为正,显示+号;若为负,显示-号
(空格)有符号的值若为正,显示带前导空格;若为负,显示-号;+修饰符会覆盖(空格)修饰符
# 对于%o格式,以0开头;对于%x,%X格式,以0x,0X开头;对于所有浮点数格式,#保证即时不跟任何数字,也打印一个小数点字符;对于%g,%G,#防止尾随零被删除。
0(零)对于所有数字格式,用前导零而不是空格填充字段宽度。若出现了-修饰符或指定了精度,则忽略该修饰符
digit(s)字段的最小宽度
.digit(s) 精度。对于%e,%E,%f,表示小数的右边的数字位数。对于%g,%G,表示有效数字的最大位数。对于%s,表示字符串中的最大长度。对于整数格式,表示数字的最小位数,不够填充前导零。注意.和.0等同。
h 和整数转换说明符一起用,表示short int ,unsigned short int
hh 和整数转换说明符一起用,表示short char ,unsigned short char
l 和整数转换说明符一起用,表示long int ,unsigned long int
ll 和整数转换说明符一起用,表示long long int,unsigned long long int
L 和浮点数转换说明符一起用,表示long double
z 和整数转换说明符一起用,表示一个size_t值(sizeof返回值的类型)
t 和整数转换说明符一起用,表示一个ptrdiff_t值(两指针差值的类型)
注意:有用于打印double型和long double型的转换说明符,但没有float型的转换说明符。因为,C中符点型默认时double型,float型会自动转换为double型。
printf()会按照转换说明符表示的数据类型的占位大小和存储方式对计算机中二进制数值进行读取和解释,并转换成一系列字符(字符串),以便显示。不改变原值,只是指定不同的表现形式。
C中的函数一般都有返回值。就是由函数计算返回给调用程序的值。
printf()返回值:正常,返回所打印的字符的个数,包含所有打印字符,包括空格和换行符。错误,返回一个负数。
printf()打印长字符串:
空白字符(空格,制表符,换行符)若不是用来分隔元素,C都将忽略。
四种方式:元素间回车(不能在引号括起来的字符串中间断开);使用多个printf()语句,最有一个包含‘ ’;反斜杠+回车;字符串连接法(两个字符串间仅用空白字符分隔,C会组合成一个字符串处理)
9.scanf()-读取(逐个字符读取),转换(字符串文本转换成数值),解释,存储
scanf()读取基本数据类型,变量名前加&(取地址符);读取字符数组,不加&;
scanf()根据空白字符将输入分成多个字段,并依次把转换说明符和字段相匹配。
scanf()中的转换说明符:
%e,%E,%f,%F,%g,%G,prinft()用于float和double,scanf()只用于float。
%c 解释为一个字符
%s 解释为一个字符串,从第一个非空白字符起,到下一个空白字符止。
%d,%i 解释为一个有符号的十进制数
%u 无符号的十进制数
%o 有符号的八进制数
%x,%X 有符号的十六进制数
%p 一个指针(地址)
%a,%A 浮点型
%e,%E,%f,%F,%g,%G float浮点数(仅float,对于double需加l修饰符,对于long double需加L修饰符)
scanf()的转换修饰符:
* 滞后赋值,丢弃对应读取内容
digit(s)最大字段宽度,在达到最大字段宽度或遇到空白字符时,停止对输入项的读取
h %hd,%hi,表示会存储在short int;%hu,%ho,%hx表示会存储在unsigned short int;
hh 把整数读作signed char,unsigned char
l %ld,%li long;%lu,%lo,%lx unsigned long;%le,%lf,%lg double;%Le,%Lf,%Lg long double;
ll 把整数读作long long ,unsigned long long
如果没有这些修饰,d,i,o,x指int型;e,f,g指float型。
scanf()输入原理:
scanf的转换说明符提供了要读取的数据类型信息,每个数据类型的表示所需的字符构成特定的字符集内,如%d对应有符号十进制整数,字符集是{0,1,2,3,4,5,6,7,8,9,-,+}。
scanf逐个字符的读取输入字符串,跳过空白字符,直到遇见第一个非空白字符,若在特定字符集内,读取保存,继续扫码下一个字符,直到遇到第一个非特定字符集字符,scanf结束读取,并将最后读取的非特定字符集字符放回输入。最后,scanf将它读取的字符串转换解释成数值,存入指定变量中;若第一个非空白字符就是非特定字符集字符,scanf()会停在那里,并把读取的字符放回输入,不会读取下一个字符,指定的变量中也不会被赋上任何值。下一个scanf()依然会从这个字符开始读取。
空白字符,非特定字符集字符,字段宽度,读取到输入内容末尾都是scanf()停止读取的条件。
scanf读取%s时,会在字符串最后添加‘空字符 ’,再存入char数组,使之成为C字符串。
scanf读取%c时,所有字符平等读取,包括空白字符也会读取。
scanf()的格式字符串中可以有普通字符。除了空格字符外,你的格式字符串一定要与输入字符串精确匹配。如scanf(%d,%d);你必须输入12,345或12, 345,12后面必须紧跟逗号‘ ,’不能有空格。在格式串中的空格表示跳过下一个输入项之前的任何空格。scanf(%d, %d);你可以输入12,345;12 ,345;12 , 345;
scanf()返回值:返回成功读取的项目的个数;什么都没读取,返回0;读取到文件结尾,返回EOF。
转换说明符的修饰符*,在printf()中,可用*表示可变的字段宽度,在参数列表中需要对应的变量。在scanf()中表示丢弃读取的对应项。