2013年10月19日 星期六 09时58分24秒
程序在内存中是分段落存放的
代码段 程序中的所有语句存放在这个段落中,运行时不可以被修改
全局段 存放全局变量和静态变量,大小不会随着程序的运行而改变
栈 存放局部变量,块变量,形参,返回值,大小会随着程序的运行而改变
变化方式遵循后进先出原则
每个函数在运行的时候都会从栈中分配一段空间
当函数结束的时候它所分配的空间被计算机回收
堆 堆中变量的生命周期由程序控制
字符串:
由一组连续的字符变量构成的,所有字符串必须以字符'\0'作为结果
计算机中使用第一个字符变量的地址表示整个字符串
字符串的地址数据可以存放在一个char*类型的指针变量中
字符串有两种来源,分别对应程序中两种不同的写法
字符串的字面值是一种字符串的来源,例如"abc","124"等
字符串字面值在编译的时候会直接用首字符地址替换掉,并且在最后加上字符'\0'
字符串字面值在程序运行时存储在专门的段落里,这个段落是不可以修改的
多个同样的字符串字面值在运行时只有一份
两个连续的字符串字面值可以被合并成一个 "abcde"=="ab""cde"
字符串的另外一种来源是字符数组
只有包含'\0'字符的数组才可以当字符串使用 '\0'以前的字符属于字符串
可以直接使用字符串字面值对字符数组进行初始化,字面值最后的'\0'也会被赋值到字符数组中
初始化完成后字符数组和字面值存放在不同的地方
字符数据存放的位置不确定,但一定是可以被修改的
C语言中提供了一组函数用来对字符串进行操作
为了使用这些函数需要包含string.h文件
strlen 用来计算字符串中有效字符的个数
strcat 用来合并两个字符串
参数表示的字符串后面把合并好的字符串首字符地址作为返回值
如果第一个参数表示的字符数组中变量个数不够可能会发生溢出
strncat 功能和strcat一样,可以避免溢出问题
strcmp 比较两个字符串的大小,用返回值表示比较结果
strncmp 仅比较两个字符串的前N个字符
strcpy 复制字符串:第一个参数是一个字符数组,第二个参数表示要复制的字符串
用新字符串的首字符地址作为返回值
strncpy 只复制前n个字符
练习:
编写mystrlen函数
读取和打印字符串的时候都可以采用%s作为占位符
从键盘读字符串之前必须首先声明一个字符数组
fgets函数可以从任何文件读字符串,并放置在一个数组中
在linux系统中所有设备都可以当作文件使用(stdin代表的就算标准输入文件,键盘)
fgets函数需要三个参数
1.数组名称
2.数组中变量个数
3.读取的文件(stdin表示标准输入文件,通常就是键盘)
如果输入内容不够多则会把最后的换行字符读入到数组中
fgets(buf,20,stdin);
if(strlen(buf) == 19 && buf[18] != '\n')
{
scanf("%*[^\n]"); //把所有不是换行符的字符丢掉
scanf("%*c"); //清理第一个字符
}
练习:
编写一个模拟登陆程序
---------------------------------------------------------
二维字符数组可以用来表示多个相关字符串
指针数组也可以用来表示多个相关字符串
指针数组声明如下:
char *strs[5] = {};
预习:
1.主函数的参数
2.文件位置指针
3.预处理指令
4.多文件程序的编写
作业:
1.编写mystrcat函数
2.编写indexof字符串函数