1.gets与puts
我们之前说到过scanf的匹配机制,我们输入整型数浮点数和字符型时,读到空格和换行符时不能匹配,从而标准输入缓冲区内的空格和回车会被“消掉”。而对于读取字符串时,我们读到一空格就会匹配结束。那么问题来了,当我们想要输入一个带空格的字符串的时候,我们应该如何使得空格也被输入当作字符串的一部分而不是字符串的分隔符呢?这里就需要介绍的是gets和puts函数了,请看代码:&c【0】==c gets(c);
如图,我们定义了一个长度为20的字符数组,用来存储字符串。值得注意的是,在c语言中,并没有预先定义好string这种专门用来存储字符串的类型,所以要想存储字符串,我们当前必须要用到字符数组,而字符数组作为一种比较特殊的数组,编译器给这个数组的名字存储了一个值,这个值就是这个数组的空间的首地址。
与scanf不同,gets并不会因为空格而结束匹配,gets是按行进行读取的,只有我们敲击回车才会结束匹配。gets内传入的参数是一个指向字符数组的指针(本质就是地址),而作为字符数组,名字就存储的是首地址。所以我们直接写的是字符数组的名字。puts同上。
2.str系列操作
关于字符数组有一系列内置的函数进行操作(不要忘记引入string.h头文件)下面来总结一下:
2.1 strlen(对应字符数组的指针):返回对应字符数组的长度
2.2 strcpy(复制到的字符数组的指针,被复制的字符数组的指针)
2.3 strcmp(字符数组1/常量字符串1,字符数组2/常量字符串2):比较原理是每个位置的字符的ascii码比较大小,一旦有不同,不再比较;
前者对应位置>后者对应位置 返回1
前者对应位置=后者对应位置 返回0
前者对应位置<后者对应位置 返回-1
2.4 strcat(被拼接串,拼接串):将后串拼接到前串上
3.指针
指针的本质就是地址,我们看一段代码:
定义了一个整形变量i,赋值为5;定义了一个指向整形变量的指针i_pointer,指向变量i,来看看在内存是怎么存储的吧:
系统分配了一块地址空间给变量i,i里面存储的值是5;而内存中的每一块空间都是有地址的,就如同城市中的每一栋楼,都是有地址可以表示其具体方位的。假设i这个空间的地址是2000,接下来我们定义了一个指针变量i_pointer指向i,系统分配了一段空间给这个变量,而这个变量存储的就是2000,就是它指向的变量的地址2000。
在这个过程中,我们用到了两个符号:取值运算符,&取地址运算符。顾名思义,&就是对某个变量取其地址,而就是取某个地址所指向的变量。这也就造成了两种访问方式:直接访问和间接访问:我们可以直接用变量进行访问,也可以对某个变量取出地址(&变量),接着取这个地址指向的变量(*地址):