数组和字符串笔记重点:
1.元素在内存中是连续依次排列的,并且拥有下标(从0开始),叫数组 2. 数组名是数组的起始地址。sizeof(a)求数组空间 3. 编译器和运⾏环境都不会检查数组下标是否越界,⽆论是对数组单元做读还是写 4.⼀旦程序运⾏,越界的数组访问可能造成问题,导致程序崩溃 • segmentation fault • 但是也可能运⽓好,没造成严重的后果 • 所以这是程序员的责任来保证程序只使⽤有效的下标值:[0,数组的⼤⼩-1] 5.元素的个数小于数组长度时,多余数组元素初始化为0
二维数组和多维数组
列数不可以省略,行数可以
两行以上的数组称之为多维数组
注意:
- 最好避免出现数组越界方问,循环变量最好不要超出数组的长度。
- C语言的数组长度一经声明,供度就是固定无法改变,并且C语言并不提供计算数组长度的方法
- C语言获取数组长度: int length = sizeof(arr) / sizeof(arr[0])
字符数组和字符串
char word[] = {‘h’,‘e’,‘l’,‘l’,‘o’,’!’} 字符数组,不是字符串因为不能用字符串的方式做计算(极其灵异)
char word[] = {‘h’,‘e’,‘l’,‘l’,‘o’,’!’,’\0’} 字符串 ‘\0’ 结束
- 以0(整数0)结尾的⼀串字符
• 0或’\0’是⼀样的,但是和’0’不同 - 0标志字符串的结束,但它不是字符串的⼀部分
• 计算字符串⻓度的时候不包含这个0 - 字符串以数组的形式存在,以数组或指针的形式访问
• 更多的是以指针的形式 - string.h ⾥有很多处理字符串的函数
字符串的函数
-
strlen 返回s的字符串⻓度(不包括结尾的0)
-
strcmp ⽐较两个字符串,返回:
• 0:s1==s2
• >0:s1>s2
• <0:s1<s2 -
strcpy把src的字符串拷⻉到dstchar * strcpy(char *restrict dst, const char *restrict
src);
– restrict表明src和dst不重叠
• 返回dst
• 为了能链起代码来 -
strcat
• 把s2拷⻉到s1的后⾯,接成⼀个⻓的字符串
• 返回s1
• s1必须具有⾜够的空间 -
strchr
• char * strchr(const char *s, int c); 从前往后 反回NULL表示没找到,否则返回字符位置地址
• char * strrchr(const char *s, int c); 从后往前同上 -
strstr
• char * strstr(const char *s1, const char *s2); 找到则返回词句的第一个字母地址否则反回NULL
• char * strcasestr(const char *s1, const char *s2);
安全问题:
- strcpy和strcat都可能出现安全问题
- 如果目的地没有⾜够的空间?
安全版本
• char * strncpy(char *restrict dst, const char *restrict
src, size_t n);
• char * strncat(char *restrict s1, const char *restrict
s2, size_t n);
• int strncmp(const char *s1, const char *s2, size_t n);