程序在内存中是分段存储的
代码段:存放所有语句转换成的数字,程序运行时不可以修改
全局段:用来记录全局变量和静态变量的存储位置,这个段落的大小不会随着程序的运行而改变
栈:
存放局部变量,块变量,形式参数和返回值的存储位置,这个段落的大小随着程序的运行不断改变
每当一个函数调用出现时,就从这个段落中分配一段空间用来记录它自己的变量。
当函数调用结束时,它所分配的空间被计算机回收
不同函数调用的空间之间,遵循后进先出的管理原则
堆:
这个段落用来存放动态分配的存储位置,动态分配存储位置的分配和回收工作由程序员编写语句管理,如果管理错误会产生严重后果
字符串是专门用来记录大量文字信息的
字符串中包含多个连续的字符类型存储位置,这些存储位置记录文字信息。
使用标准函数对字符串操作,需要包含string.h文件
strlen 用来计算字符串中有效字符的个数(不包含 )
1 #include <stdio.h>
2 #include <string.h>
3 int main() {
4 printf("字符个数是%d
",strlen("abc"));
5 printf("sizeof %d
", sizeof("abc"));
6
7 return 0;
8 }
结果:
字符个数是3
sizeof 4
strcat 用来把一个字符串追加到另一个字符串的末尾,会修改一个原来的字符串,用返回值表示新字符串
这个函数可能造成数组下标越界,所以可能是不安全的。
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char buf[20] = "abc";
6 strcat(buf, "def");
7 printf("%s
", buf); printf("%s
", strcat(buf, "def"));
8 return 0;
9 }
结果:
abcdef
abcdef
strncat 可以指定最多合并多少个字符到第一个字符串,所以可以避免下标越界
strcpy 可以复制一个字符串,调用函数需要提供存储位置用来记录复制得到的新字符串,用返回值表示复制得到的新字符串,也可能造成下标越界,也是不安全的。
strncpy 功能和strcpy类似,但只复制前n个字符
strcmp 用来比较两个字符串的大小,比较的依据是字符的ASCII码数值
返回1表示前一个字符串大,返回0表示一样大,返回-1表示前一个字符串小
strncmp 只比较两个字符串中前n个字符
可以使用%s做占位符读写字符串
使用scanf从键盘读字符串是不安全的
fgets函数从任何文件得到一个字符串并放在一个数组中
在Linux中一切都可以用文件表示,键盘是标准输入设备,用标准输入文件表示(stdlin)
显示器是标准输出设备,用标准输出文件表示(stdout)
需要三个参数
1.数组名称(得到的字符串存储在这个数组的存储位置中)
2.数组中存储位置个数
3.要读取的文件(stdin)
函数会在数组最后加' '结束字符
如果输入的字符个数不够多则会把最后的回车字符也读入到数组中
读取完成后,如果输入缓冲区中还留有垃圾数据,则需要清理
1 #include <stdio.h>
2 #include <string.h>
3
4 int main() {
5 char buf[10] = {};
6 printf("请输入一个字符串:");
7 fgets(buf, 10, stdin);
8 printf("%s
", buf);
9 if(strlen(buf) == 9 && buf[8] != '
') {
10 //此条件说明输入缓冲区有东西,需要清除
11 scanf("%*[^
]");
12 scanf("%*c");
13 }
14 printf("请输入一个字符串:");
15 fgets(buf, 10, stdin);
16 printf("字符串是%s
", buf);
17 return 0;
18 }