师承clc
就是字符数组,虽然我不想这么说
定义的几种格式:
和整型一样,int data[ ] = {1,2,3,4,5};
2. 和整型数组一个道理,char str[ ] = {'h','e','l','l','0'};
3. 改进 ---char str[ ] = "hello";
4.一般用char *p =“hello”
第三和第四的区别:
3是字符串变量
4是字符串常量--不予许被修改
5.注意指针的操作:
保存地址可以--修改指向--指向字符串常量的地址空间
对野指针的内存空间操作不行
和整型数组在存储上的区别
回忆如何计算数组的大小及数组元素的个数
字符数组的存储方式
多了结束标志‘\0’
sizeof和strlen的区别
编程案例
sizeof计算的是空间/地址大小,strlen计算的是有效数据长度
无论什么指针类型,指针占几个字节跟语言无关,而是跟系统的寻址能力有关,他们地址大小都是一样的
strlen不会计算字符串后的‘\0’
当写成“hello”,后面会有‘\0’
32位和64位操作系统基本数据类型字节大小
32位
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
一些基本类型在32位及64位机上的大小差异
几种字符串常用的API
输出字符串
puts()
printf("%s",p);
获取字符串
1.scanf("%s",p)
2.gets
char * gets ( char * str );
注意
因为本函数gets()可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值
动态开辟字符串
malloc
函数原型 void *malloc(size_t size)
C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。
注意
数组,普通的变量在栈开辟空间,在函数调用后会清理栈的数据,回收内存,而malloc在堆里开辟空间,堆只有程序结束后内存才会释放,如果是死循环不断malloc可能会耗尽计算机资源
realloc
函数原型 void *realloc(void *ptr, size_t size)
扩容
C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
如果当前内存段后有足够的空间,realloc()返回原来的指针,如果当前内存段后没有足够的空间,realloc()返回一个新的内存段的指针:
free
C 库函数 void free(void *ptr) 释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。
释放,防止内存泄露
防止悬挂指针,野指针的一种
memset
函数原型 void *memset(void *str, int c, size_t n)
字符串分割
strtok
char *strtok(char *str, const char *delim)
分解字符串 str 为一组字符串,delim 为分隔符
特别要注意分割处理后原字符串 str 会变,原字符串的改动是切分符原位置均更改为 '\0'
示例代码
计算长度
strlen
用过太多啦,不多赘述
拷贝
strcpy
char *strcpy(char* dest, const char *src);
自己实现
strncpy
char *strncpy(char *dest, const char *src, int n)
表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest
自己实现
断言
assert
拼接
strcat
char *strcat(char *dest, const char *src);
把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
自己实现
各大操作系统关于strcat的原码:https://www.cnblogs.com/elesos/archive/2012/11/08/2759790.html
比较
strcmp
int strcmp(const char *s1,const char *s2);
若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
自己实现
strncmp
int strncmp ( const char * str1, const char * str2, size_t n )
功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 小于s2,则返回小于0的值。
自己实现
查找子字符
strchr
char *strchr(const char *str, int c)
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置
自己实现
查找子串
strstr
char *strstr(char *str1, const char *str2);
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL