目录
strlen()
计算字符串长度(字符元素个数)
strlen()从字符串的开头位置依次往后面计数,直到遇到‘\0’停止,所计算的字符串大小为‘\0’以前的字符所计算的值,最终的字符串长度不包括‘\0’
调用strlen()需要引用的头文件是<string.h>,它的原型是size_t strlen(const char* str);str表示的是需要计算长度的字符串,由此看出传参的时候应该传的是一个地址而不是一个数值。
断言assert(arr)
检查指针是否合法
检查arr指针是否合法。
使用断言的时候需要引用头文件assert.h.
断言一个指针:
assert(arr)
断言两个指针:
assert(arr1 && arr2)
长度不受限制的字符串函数
strcpy(arr1,arr2)
拷贝字符串
完整定义为:char *strcpy( char * str Destination, const char * strSource );
char * strcpy(char * destination,const char * source);
复制字符串,将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。
为了避免溢出,由destination指向的数组的大小应足够长,以包含相同的C字符串assource(包括终止空字符),并且不应在内存中与source重叠。
这个函数接受两个参数:一个目标字符串(dest)和一个源字符串(src)。
它首先将目标字符串(dest)的第一个字符设置为源字符串(src)的第一个字符,然后逐个复制源字符串中的字符到目标字符串中,直到遇到源字符串的结束符。
这个过程是通过指针进行的。`strcpy`函数首先将目标字符串(dest)的地址赋给一个指针变量(通常是`*dest`),然后通过这个指针变量逐个复制源字符串中的字符到目标字符串中。当复制到目标字符串的末尾时,`strcpy`函数会检查是否已经复制到了目标字符串的结束符,如果是,那么它会将结束符添加到目标字符串的末尾。
需要注意的是,`strcpy`函数不会检查目标字符串是否有足够的空间来存储源字符串,这可能会导致缓冲区溢出,进而引发安全问题。因此,在使用`strcpy`时,必须确保目标字符串有足够的空间来存储源字符串,或者使用其他安全的方法来复制字符串。
strcpy返回值为目标字符串的指针。
模拟实现strcpy
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> #include<string.h> char* my_strcpy(char* arr1, const char* arr2) { assert(arr1 && arr2); char* ret = arr1; while (*arr2) { *arr1++ = *arr2++; } return ret; }; int main() { char a1[100] = "hello"; char a2[100] = " world!"; my_strcpy(a1, a2); printf("%s", a1); return 0; }
strcat(arr1,arr2)
追加字符串
在arr1后面追加arr2。
追加过程:
`strcat`是一个常用的C语言函数,用于连接两个字符串。其基本原理是:
1. **内存分配**:`strcat`首先会检查目标字符串的缓冲区是否有足够的空间来存放源字符串。如果没有,它将引发错误或导致缓冲区溢出,这是一种常见的安全问题。
2. **源字符串复制**:如果源字符串和目标字符串的缓冲区都足够,`strcat`会复制源字符串到目标字符串的末尾,并在目标字符串的末尾添加一个空字符('\0'),以表示字符串的结束。
3. **添加终止字符**:`strcat`会遍历源字符串,直到找到空字符('\0'),并将其添加到目标字符串的末尾。这个空字符标记了源字符串的结束,也是目标字符串扩展后的结束位置。总的来说,`strcat`的工作原理是先将源字符串复制到目标字符串的末尾,然后在末尾添加一个空字符来标记字符串的结束。注意,如果目标缓冲区太小,可能会发生溢出,这是需要避免的情况。
模拟实现strcat
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> #include<string.h> char* my_strcat(char* arr1, const char* arr2) { assert(arr1 && arr2); //找'\0' int a = 1; char* ret = arr1; while (*arr1++) { a++; } //追加 arr1--; while (*arr2) { *arr1++ = *arr2++; } return ret; }; int main() { char a1[100] = "hello"; char a2[100] = " world!"; my_strcat(a1, a2); printf("%s", a1); return 0; }
使用strcat时,自己给自己追加会导致陷入追加的循环。
strcmp(arr1,arr2)
比较字符串
用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),
若str1>str2,则返回正数。
若str1=str2,则返回零;
若str1<str2,则返回负数;
(比较规则是:相同下标的字符相比,比较ASCII值大小)
比较两个字符串比较C字符串str1和C字符串str2。这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续处理后面的字符对,直到字符不同或到达终止空字符为止。这个函数执行字符的二进制比较。
长度不受限制和长度受限制的理解
长度不受限制,指的是:
strcpy:copy至\0
strcpy:追加至\0
strcmp:比较至\0
长度不受限制指的是:到\0的长度不受限制长度不受限制可能会有危险,因为长度不受限制时,目标空间不够的情况下还进行操作,会有危险。
没有提前声明时,即使是标准的
strcpy
strcat
strcmp
也会报错,编译器也会提示函数是危险的函数。
长度受限制的字符串函数
strncpy
strncpy,比strcpy多了一个参数n,n的意义是拷贝的字符个数。不过,拷贝了字符后,整个字符串后面不会自动加\0。
也就是说,整个拷贝后的结果,不会有\0。因为拷贝函数中,\0是拷贝停止条件,而不是拷贝内容。
机制:
- 在每一次拷贝时,n都会减一,n一直到0时,才会停止拷贝。
- 如果没有拷贝的内容,即源字符串长度不够,则每一次拷贝的内容是\0。
- 也就是说,整个拷贝后的结果,不会有\0。因为拷贝函数中,\0是拷贝停止条件,而不是拷贝内容。
- n一直到0时,才会停止拷贝。
- 如果没有拷贝的内容,即源字符串长度不够,则每一次拷贝的内容是\0。
strncat
strncat,比strcat多了一个参数n来限制追加的字符个数。
n代表追加n个源字符串中的字符。
strncmp
strncmp,比strcmp多了一个参数n,n代表的是比较的字符个数。
不过,由于该函数的比较机制,可能比较不到n个字符,函数就已经结束比较并返回结果了。
字符串查找
strstr(arr1,arr2)
字符串查找函数strstr
判断是否为子集
strstr是一个标准库函数。
判断arr2是否为arr1的子集。
查找时,有两种情况(简单和复杂)
第二种情况,体现出strstr的查找机制。
关于返回值:
如果可以找到,返回第一次出现的位置。
不过不能找到,返回
strtok(str,sep)
char * strtok ( char * str, const char * sep );
- ep参数是个字符串,定义了用作分隔符的字符集合。
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
- strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
第一次使用的时候要传一个数组和标记字符集。
第二次使用,传null和标记字符集。
strtok函数每次在消除特殊字符时,会记录每次消除的特殊字符的位置以便下一次strtok函数的使用。
当strtok函数找不到特殊字符时,将会返回空指针NULL。
strtok函数在运行时会创建一个静态变量以保存下一次的切割位置。(静态变量创建后不销毁)
正常使用的strtok并不是一个一个拿出来的,而是使用for循环来进行切割操作。
错误信息报告
strerror (errnum)
char * strerror( int errnum );
C语言的库函数在运行的时候,如果发出错误,就会将错误代码存在一个变量中(全局变量),这个变量是errno
错误码是一些数字。
我们需要将错误码翻译成错误信息。
每一个错误码,都对应着一串错误信息。
使用strerror(),用完后会返回一个指针。
这个指针是那条错误信息的首次母指针。
使用strerror()函数时,要引用头文件是string.h。
当使用errono时,需要引用errno.h文件
函数perror
perror也可以打印错误信息。
perror=printf+strerror
perror函数,perror是直接打印错误信息。
但是!!!
在打印错误信息之前,会先打印自定义的信息。
(怎么说呢,就是如果我们自己有打印的内容,那控制台上就会先打印我们自己的内容,再打印错误信息。)
使用perror的头文件是:stdio.h
字符分类函数
函数 | 如果它的参数符合下列条件就返回真 |
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行'\n',回车‘\r’,制表符'\t'或者垂直制表符'\v |
isdigit | 十进制数字 0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~z或A~Z |
isalnum | 字母或者数字,a~z,A~Z,0~9 |
ispunct | 标点符号,任何不属于数字或者字母的图形字符(可打印) |
isgraph | 任何图形字符 |
isprint | 任何可打印字符,包括图形字符和空白字符 |
字符转换函数
这两个函数的参数,也可以是字符。因为传参传的是ASCII码值。
int tolower ( int c );
大写字母转小写
int toupper ( int c );
小写字母转大写