一、字符串
定义的方法
1.静态数组构造:
char a[长度] ,(a即为首地址==&a[0])
2.指针动态构造数组
char * p=(char *)malloc(长度);//其p的内容相当于有了动态分配空间的首地址
3. 初始化字符串
输入的方法
1、利用scanf
scanf("%s",地址);遇到空格即终止输入
2、利用gets(功能单一,只用于字符串的输入)
gets(地址);空格也默认为是字符串的一部分
3、利用while(ch=getchar())
输入字符串,按换行后,则getchar根据循环逐一获取字符,局限必须要用while
输出的方法
1.printf
功能多样,输入后不换行
2.puts
格式:
puts(地址)
功能:
功能单一,只用于字符串输出, 且输出后自动换行。
strlen函数(要加头文件 #include <string.h>)
格式:strlen(数组名(地址))
功能:读取字符串的长度,但会忽略结束符(\0);
注意点
1、字符串长度的问题
字符串输入后,其长度会加1,因为里面有个结束符"\0",用于终止输入和输出
所以只能char a[4]="had";长度是4,不是3
二、结构体
什么是结构体
一个属性当中其元素的集合
为什么需要结构体
1.因为现实当中,事物的属性远比简单数据类型复杂多变
。所以我们经常把同意属性归为一类成为结构体(好比一个人的年龄,升高,体重,事业都是描述这个人的属性)
2.增加便利性:因为若无发送实参,和接受的形参定义太多了
,所以及不便利;而我们使用了结构体,只需定义一个结构体变量,然后发送其地址,用指针来处理问题,其在函数中就可以直接调用其结构体中的内部成员。
简单结构体
- .定义结构体 三种: 我们只讲一种
声明结构体:
struct 类型名(其整体为一个结构体数据类型)
{
数据类型 成员名;
........
};
定义结构体变量
-
.结构体赋值和初始化
1.定义的同时可以进行整体赋初值
2.定义完之后,就只能单个赋初值 -
.如何取出结构体的每一个成员 三种常见:变量名.成员名 或者 指针变量->成员名(或为 (*指针变量).成员名)
结构体数组
-
静态结构体数组(和普通数组差不多) 把其当作普通数组来看待,只是说每个元素里面又包含了许多小成员,(这就是好比可以存储多名同学的数据)
struct student str[]; str[].age; 反例:struct student * q[4];//表示q可以连续存放4个struct student 类型的地址,就不表示结构体数组了
-
动态结构体数组
struct student * p=(struct student *)malloc(字节数); p[].age或者*(p+..)age。而不能p->age[] 且我们只能用指针来输出其中的内容,而不能用定义的普通结构体变量
定义了两个结构体变量:
一个为指针p,且构造了一个动态数组 其里面结构体存放在连续的内存单元中
另一个为普通变量str 其里面结构体存放在另一个连续的内存单元中
所以两个不同的存储单元,互不干涉
对于结构体的核心理解;
1、一个结构体就相当于一个数据类型,
用这个结构体类型定义的变量(所占字节数比较复杂),就相当于int类型定义的变量(其所占四个字节);int i与同类型int j,其i可与j相互赋值,则结构体变量也可相互赋值
2、一个结构体变量
结构体变量就像包含了许多小变量,而其用来赋值时为 变量名.成员名 或者 指针变量->成员名(或为 (*指针变量).成员名)
三、文件操作
文件定义
1.分类
对程序而言分为两类:程序文件,数据文件
- 程序文件:
- 数据文件:
2.两文件之间在程序运行时的操作
数据文件
1.文件名
2.文件类型
3.对于FILE的解读
4.几个重要与文件有关的函数
其它的一些小知识
1.流
和之前不同的是,数据所输入输出的对象从终端变成了文件。如printf
,scanf
分别是将数据输出到屏幕和从键盘输入数据。 如今我们可以将屏幕和键盘换成文件,对文件进行输入和输出。、
流主要是指一种逻辑上的概念,产生数据的叫输入流,消耗数据的叫输出流。至于产生和消耗,因设备不同而有所差异,但C语言中对它们一视同仁,以“流”代之。
将字符放入文件中,或打印到屏幕上,这里的文件和屏幕就是外部设备。如屏幕、网络、文件,硬盘都是外部设备。不同设备的读写方式肯定不一样,为方便起见,故抽象出“流”的概念,以一个“流”字来概括它们的特征。故可把流看作是一种数据的载体,通过它可以实现数据交换和传输,传递数据的方式由“流”决定。我们仅需将数据放入“流”当中即可。
getchar和putchar函数
1.格式:
char ch=getchar();//getchar 只能获取一个字符,将其赋值给ch;
putchar(ch(变量)或'字符')//putchar 也是只能输出一个字符,
2.getchar原理和putchar
当使用getchar时,键盘在终端可以输入字符串,每输入一个字符,字符逐一送入缓冲区
进行保存,然后按下回车键(缓冲区进行刷新)(回车键也是字符,也会送入缓冲区),
然后getchar就每执行一次,就按顺序读取缓冲区里的字符一个,所以如果不用while循
环利用getchar则就不能完整读取输入的字符串,缓冲区刷新完之后,getchar读取就停
止了
putchar 也是和getchar一样,ch变量中的数据会被逐一送入缓冲区,然后被putchar
一个一个输出,缓冲区刷新完之后,也就输出停止,且会自动换行
这就很好解释了为什么getchar是一个一个读取,且回车键也是字符被送入缓冲区