1 数组
1.1 一维数组定义与使用
int array[10];//定义一个一维数组,名字叫array,一共有10个元素,每个元素都是int类型的 array[0] = 20; array[1] = 30; array[9] = 80; //array[10] = 100;//错误,没有 array[10]这个元素 |
1.2 数组在内存的存储方式
数组在内存中就是一段连续的空间,每个元素的类型是一样的
1.3 一维数组初始化
int array[10] = { 100, 1, 5, 3, 4, 5, 6, 7, 8, 0 };//定义数组的同时为数组的成员初始化值 |
int array[10] = { 3, 7, 9 };//将数组的前三个元素赋值,其余元素置为0 |
int array[10] = { 0 };//将数组所有的元素都置为0 |
int i; for (i = 0; i < 10; i++) { array[i] = 0;//通过循环遍历数组的每个元素,将元素的值置为0 } |
1.4 二维数组定义与使用
int array[2][3];//定义了一个二维数组,有两个array[3] |
1.5 二维数组初始化
int a[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; |
2 字符串与字符数组
2.1 字符数组定义
char array[100]; |
2.2 字符数组初始化
char array[100] = {‘a‘, ‘b‘, ‘c‘,‘d‘}; |
char array[100] = "abcd"; |
char array[100] = { 0 }; |
char array[] = "abcd"; |
2.3 字符数组使用
2.4 随机数产生函数rand与srand
头文件stdlib.h
Rand是伪随机数产生器,每次调用rand产生的随机数是一样的
如果调用rand之前先调用srand就出现任意的随机数
只要能保证每次调用srand函数的时候,参数的值是不同的,那么rand函数就一定会产生不同的随机数
#include <time.h> int t = (int)time(NULL); srand(t); for (int i = 0; i < 10; i++) { printf("%d\n", rand()); } |
2.5 用scanf输入字符串
char s[10] = { 0 }; scanf("%s", s);//"%s"的作用就是输入一个字符串的,scanf是以回车键作为输入完成标示的,但回车键本身并不会作为字符串的一部分 //如果scanf参数中的数组长度小于用户在键盘输入的长度,那么scanf就会缓冲区溢出,导致程序崩溃 int i; for (i = 0; i < 10; i++) { printf("%d\n", s[i]); } printf("----------------------------------\n"); printf("%s\n", s); return 0; |
2.6 字符串的结束标志
Scanf将回车,空格都认为是字符串输入结束标志,
2.7 字符串处理函数
2.7.1 gets
char s[100] = { 0 }; gets(s);//gets认为回车的输入结束标示,空格不是输入结束标示,所以用gets这个函数就可以实现输入带空格的字符串 //gets和scanf一样存在缓冲区溢出的问题 int i; for (i = 0; i < 10; i++) { printf("%d\n", s[i]); } printf("----------------------------------\n"); printf("%s\n", s); |
Gets不能用类似“%s”或者“%d”之类的字符转义,只能接受字符串的输入
2.7.2 fgets函数
gets函数不检查预留缓冲区是否能够容纳用户实际输入的数据。多出来的字符会导致内存溢出,fgets函数改进了这个问题。
由于fgets函数是为读取文件设计的,所以读取键盘时没有gets那么方便
char s[100] = { 0 }; fgets(s, sizeof(s), stdin); |
2.7.3 puts函数
puts函数打印字符串,与printf不同,puts会在最后自动添加一个’\n’
char s[] = "hello world"; puts(s); |
2.7.4 fputs函数
fputs是puts的文件操作版本,
char s[] = "hello world"; fputs(s, stdout); |
2.7.5 strlen,字符串长度
size_t strlen(const char * _Str);
返回不包含字符串结尾’\0’的字符串长度
char s[100] = "hello world"; int len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0) printf("len = %d\n", len); return 0; |
2.7.6 strcat,字符串追加
size_t strcat(char * _Str1, const char * _Str2);
将参数_Str2追加到_Str1后尾
char s[1024] = "hello world"; int len = strlen(s);//得到字符串长度,返回一个字符串中有效字符的数量(不包含字符串结尾的0) printf("len = %d\n", len); char s1[100] = "abc123456789"; strcat(s, s1);//将两个字符串合并,结果放入第一个参数里面,strcat也存在缓冲区溢出的问题 printf("%s\n", s); |
2.7.7 strncat,字符串有限追加
size_t strncat(char * _Str1, const char * _Str2, size_t len);
2.7.8 strcmp,字符串比较
int strcmp(const char * _Str1, const char * _Str2);
比较两个字符串是否相等,相等返回0,不等返回非0
2.7.9 strncmp,字符串有限比较
2.7.10 strcpy字符串拷贝
char *strcpy(char * _Str1, const char * _Str2);
将参数_Str2拷贝到参数_Str1中
2.7.11 strncpy字符串有限拷贝
2.7.12 sprintf,格式化字符串
和printf函数功能类似,printf函数将格式化结果输出到屏幕,sprintf将格式化结果输出到字符串
2.7.13 Sscanf函数
Sscanf类似于scanf函数,,scanf从键盘读取用户输入,scanf从指定格式化字符串读取输入
2.7.14 strchr查找字符
char * strchr(char * _Str, int _Ch);
在参数_str中查找参数_Ch指定字符,找到返回字符_Ch在_Str中所在位置,没有找到返回NULL;
2.7.15 strstr查找子串
char * strstr(char * _Str, const char * _SubStr)
在参数_str中查找参数_SubStr指定子串,找到返回子串在_Str中所在位置,没有找到返回NULL;
2.7.16 strtok分割字符串
字符在第一次调用时strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL每次调用成功则返回指向被分割出片段的指针
char buf[] = "[email protected]@igk"; char *p = strtok(buf, "@"); while (p) { printf("%s\n", p); p = strtok(NULL, "@"); } |
2.7.17 atoi转化为int
需要包含头文件stdlib.h