1、strlen(包含于头文件string.h)
- strlen是一种求字符串长度的函数,它的定义为
size_t strlen ( const char * str ); //引用头文件 string.h
- strlen的目标字符串以‘\0’作为结束标志,返回的则是'\0'之前出现的字符的个数(不包含'\0');
- 参数(目标字符串)必须以'\0'结尾,否则就会越界读取,返回一个错误值(随机值);
- strlen的返回类型为size_t类型(无符号类型)
- 举例:
#include<stdio.h> #include<string.h> int main() { char arr[] = { "abcdefg" };//一共7个字符 int ret = strlen(arr); printf("%d", ret); return 0; }
- 模拟实现strlen函数:
#include<stdio.h> int my_strlen( char* arr) { char* end = arr; while(*end++ ) ; return end - arr-1; } int main() { char arr[] = { "abcdefgh" }; int len=my_strlen(arr); printf("%d", len); return 0; }
2、strcpy(包含于头文件string.h)
- strcpy是一种字符串拷贝的函数,它的定义为:
char* strcpy(char * destination, const char * source );
- strcpy将source指向的字符串拷贝到destination所指向的字符串当中;
- 源字符串必须以 '\0' 结束;
- 会将源字符串中的 '\0' 拷贝到目标空间;
- 目标空间必须足够大,以确保能存放源字符串。否则可能会造成缓冲溢出的情况;
- 目标空间必须可变。(目标空间如果不可修改则会程序崩溃)
- 举例
#include<stdio.h> #include<string.h> int main() { char source[] = { "xxxx" }; char destination[20] = { "abcdefgh" }; strcpy(destination,source); printf("%s", destination); return 0; }
- 模拟实现 :
#include <stdio.h> #include <string.h> #include <assert.h> char* my_strcpy(char* dest, const char* str) { assert(*dest != NULL); assert(*str != NULL); char* ret = dest; //拷贝str指向的字符串到dest指向的空间,包含'\0' while (*dest++ = *str++) { ; } //返回目的空间的起始地址 return ret; } int main() { char arr1[] = "abcdefghi"; char arr2[] = "bit"; my_strcpy(arr1, arr2); printf("%s\n", arr1); printf("%s\n", arr2); return 0; }
3、 strcat(包含于头文件string.h)
- strcat函数定义为:
char * strcat ( char * destination, const char * source );
- 将source所指向的字符串追加到destination所指向的字符串后面(从destination中从左至右找到的第一个'\0'开始往后追加);
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- 举例
#include<stdio.h> #include<string.h> int main() { char destination[20] = { "abcd" }; char source[] = { "xxxx" }; strcat(destination, source); return 0; }
- 模拟实现:(函数主体构建这里不再赘述)
char *my_strcat(char *dest, const char*src) { char *ret = dest; assert(dest != NULL); assert(src != NULL); while(*dest) { dest++; } while((*dest++ = *src++)) { ; } return ret; }
4、strcmp(包含于头文件string.h)
- strcmp函数定义为:
int strcmp ( const char * str1, const char * str2 );
- strcmp将str2指向的字符串和str1指向的字符串从第一个开始逐个向后比较,并规定标准:
返回值对比
字符串大小 | 返回值 |
第一个字符串大于第二个字符串 |
返回大于0的数字 |
第一个字符串等于第二个字符串 |
返回0 |
第一个字符串小于第二个字符串 |
返回小于0的数字 |
- 举例:例如字符串"abcd"
和 "abce" 由于'e'>'d',则第二个字符串>第一个字符串,返回小于0的数字
"abdd"
"abce" 由于'd'>'c',则第一个字符串>第二个字符串,返回大于0的数字
模拟strcmp函数:
#include<stdio.h> int my_strcmp(char* arr, char* crr) { while (*arr && *crr) { if (*arr == *crr) { arr++;crr++; } else if (*arr > *crr) return 1; else return -1; } if (*crr == '\0' && *arr == '\0') return 0; else if (*crr = '\0') return 1; else return -1; } int main() { char arr[] = { "abce" }; char crr[] = { "abce" }; int ret = my_strcmp(arr, crr); printf("%d", ret); return 0; }
5、strstr (包含于头文件string.h)
- strstr函数定义为
char * strstr ( const char *str1, const char * str2);
- strstr用于找到str1所指向的字符串中第一次出现str2所指向的字符串的地址
- 举例:
#include<stdio.h> int main() { char arr[]={"abcdefabcdef"}; char brr[]={"bcd"}; char* p=strstr(arr,brr); return 0; }
模拟实现:
#include<stdio.h> char* my_strstr( char* str1, char* str2) { if (*str2 == '\0') return str1; while (*str1) { char* p = str1; char* crr = str2; while (*crr == *p) { p++; crr++; } if (*crr == '\0') return str1; str1++; } return (NULL); } int main() { char arr[] = { "abcdefbbcdef" }; char crr[] = { "cde" }; char* p = my_strstr(arr, crr); printf("%c", *p); return 0; }
6、7、8、strncpy,strncat,strncmp(均包含于string.h中)
区别于strcpy,strcat,strcmp,他们之间多了一个n,这个n就用于固定要访问的字符串长度。
在不讨论返回值的情况下,他们都有一个固定的格式
strn ***(char*destination,char*source,int n)
- strncpy,固定从source所指向的字符串当中拷贝从第一个字符开始,长度为n的字符串到destination所指向的字符串当中。
- strncat,将source所指向的字符串的前n个字符追加到destination所指向的字符串当中(覆盖掉destination指向的字符串末尾的
'\0')。如果n大于字符串长度,则会追加全部字符。
- strncmp,比较两个字符串的前n个字符,比较方法不变。
c语言:字符串和内存函数介绍-2