《C Primer Plus》学习笔记(第十一章到第十二章)

第十一章:字符串和字符串函数

字符串是以空字符(\0)结尾的char类型数组。

puts()函数只显示字符串,而且自动在显示的字符串末尾加上换行符。

用双引号括起来的内容称为字符串字面量,也叫做字符常量。
用单引号括起来的内容是一个字符。

字符串常量属于静态存储类别。

定义字符串数组时,必须要让编译器知道需要多少空间。要多一位存储‘\0’。

可以在初始化的时候让编译器计算数组的大小。

字符串的字面量被视为const数据(类似常量)。
如果不修改字符串,不要用指针指向字符串字面量。
通常,程序要完成某项操作只需要知道地址就可以了。

gets()
gets()函数只知道数组的开始处,并不知道数组中有多少元素,如果输入的字符串过长,会导致缓冲区溢出,即多余的字符超出了指定的目标空间。如果它们擦写掉程序中的其他数据,会导致程序异常终止

fgets()
fgets()函数的第二个参数指明了读入字符的最大数量,读到换行符,会把它存储在字符串中 第三个参数指明要读入的文件。(显示器 stdin)

fgets()存储换行符有好处也有坏处,坏处是你可能并不想把换行符存储在字符串中,好处是对于存储的字符串而言,检查末尾是否有换行符可以判断是否读取了一整行。 fputs(),第二个参数为输出的位置 stdout是显示到显示器

gets_s()
gets_s()只从标准输入中读取数据,所以不需要第三个参数,如果gets_s()读到换行符,会丢弃而不是存储它。如果gets_s()读到最大字符数都没有读到换行符,会把目标数组中的首字符设置为空字符,读取并丢弃随后的输入直至读到换行符或文件结尾。然后返回空指针。

用fgets()读取从键盘输入的数据更合适

strlen()用于统计字符串的长度

strcat()把第二个字符串的备份附加在第一个字符串的末尾,并把拼接后形成的新字符串作为第一个字符串,第二个字符串不变。(第一个字符串的空间要足够)现在的编译器好像会自动扩大第一个字符串的空间。我直接拼接超出不会报错

strncat(A,B,long),该函数可以选择拼接后的长度

strcmp()把用户的响应与已储存的字符串比较,相同返回0,比较的是字符

strncmp()函数在比较两个字符串时,可以比较到字符不同的地方,可以在某个字符串中找某一段字符串。比如

strncmp(a,“abc”,3)==0,查找a字符串中有没有abc这个字符串。

strcpy()拷贝整个字符串strncpy()第三个参数指明可以拷贝的最大字符数。
sprintf()不是显示在屏幕上,而是存储在文件中。

atof atoi atol 将字符串转换为浮点型 整型 长整数型

第十二章:存储类别、链接和内存管理

存储期是指对象在内存中保留了多少时间

作用域描述程序中可访问标识符的区域

如果一个源代码文件使用的外部变量定义在另一个源代码文件中,则必须用extern在文件中声明该变量。

static在外部 声明的变量具有文件作用域、内部链接和静态存储期
在函数内声明的变量具有块作用域、无链接和静态存储期
属于特定模块私有
外部函数可以被其他文件的函数访问,但是静态函数只能用于其定义所在的文件

rang 伪随机 和srand time配合使用可以达到一些效果

malloc()申请内存,找到合适的空闲内存块,一定要用free去释放申请的内存,负责会内存泄漏

calloc()函数接受2个无符号整数作为参数

静态存储类别所用的内存数量在编译时确定,只要程序还在运行,就可以访问存储在该部分的数据。该类别的变量在程序开始执行时被创建,在程序结束时被销毁。
自动存储类别的变量在程序进入变量定义所在块时存在,在程序离开块时消失
动态分配的内存在调用malloc()或相关函数时存在,在调用free()后释放
注意这3种存储的区域不同
volatile类型限定符(可以对程序优化,高速缓存)
volatile限定符告知计算机,代理可以改变该变量的值
restrict类型限定符
restrict关键字允许编译器优化某部分代码以更好地支持计算
_Atomic类型限定符(C11)
并发程序设计分为可以同时执行的多个线程

你可能感兴趣的:(C基础知识,学习笔记)