strlen()函数
*****提前声明:一般关于字符串的库函数需要引用的头文件一般是是#include <string.h>
作用:
strlen()函数是用来求字符串长度的函数
定义:
size_t strlen ( const char * str );
只有一个参数,为字符串的首元素地址。
模拟实现:
int my_strlen(const char* arr) {//模拟实现strlen函数
int count = 0;
while(*(arr++) != '\0') {//当指针指向的字符不为0时就++,直到找到'\0'停下来。
count++;
}
return count;
}
int main() {
char arr[] = "abcdef";
int ret = 0;
ret = my_strlen(arr);
printf("这个字符串的长度为:%d\n",ret);
return 0;
}
strcpy函数
作用:
用来拷贝一个字符串到另一个字符串的函数
定义:
char * strcpy ( char * destination, const char * source );有两个参数,destination参数指的是目标串的地址,source指的是源串的地址。
注意事项:
注意事项:
1.源字符串必须以'\0'结尾
2.会将源字符串中的'\0'拷贝到目标空间
3.目标空间必须足够大,以确保能存放源字符串
4.目标空间必须可变
5.strcpy函数返回的是目标空间的起始地址
模拟实现:
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest,const char* src){
assert(dest && src);//断言。检查两个指针是否是空指针。
char* ret = dest;
while(*src != '\0') {
*dest++ = *src++;
}
*dest = *src;
return ret;
//进阶版
/*
while(*dest++ = *src++){
;
}
return dest;
*/
}
int main() {
char arr1[20] = "abcdefg";
char arr2[] = "Hello";
char* ret = my_strcpy(arr1, arr2);
printf("拷贝后的字符串为:%s", ret);
return 0;
}
strcat()函数
作用:
字符串拼接
定义:
char * strcat ( char * destination, const char * source );有两个参数,destination参数指的是目标串的地址,source指的是源串的地址。
注意事项:
1.源字符串必须以'\0'结尾
2.目标空间必须足够大,以确保能存放源字符串
3.目标空间必须可修改
4.不能使用strcat函数来给自己追加,理论上会出现死循环。
模拟实现:
#include<stdio.h>
#include<assert.h>
void my_strcat(char* dest, const char* src) {
assert(dest && src);
while (*dest != '\0') {//找到目标字符串的结束位置
dest++;
}
while (*dest++ = *src++) {//相当于使用了strcpy函数将源字符串从目标字符串的结束位置开始拷贝
;
}
}
int main() {
char arr1[20] = "abcdefghij";
char arr2[] = "Hello World!";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
strcmp函数
作用:
字符串比较(函数比较的不是字符串的长度,而是比较字符串对应位置上的大小。如果相同,就比较下一对,直到不同或者都遇到'\0')
定义:
int strcmp ( const char * str1, const char * str2 );有两个参数,destination参数指的是目标串的地址,source指的是源串的地址。
返回值为 int:
大于0则str1>str2
小于0则str1<str2
等于0则相等。
模拟实现:
int my_strcmp(const char* dest, const char* src) {
assert(dest && src);
while ((*dest == *src) && (*dest) != '\0' && (*src != '\0')) {
src++;
dest++;
}
if (*dest > *src) {
return 1;
}
else if (*dest < *src) {
return -1;
}
else {
return 0;
}
}
#include<stdio.h>
#include<assert.h>
int main() {
char arr1[20] = "abcdaafadsdf";
char arr2[20] = "j";
int ret = my_strcmp(arr1,arr2);
if (ret > 0) {
printf("arr1字符串更大");
}
else if (ret < 0) {
printf("arr2字符串更大");
}
else {
printf("两个字符串相等");
}
return 0;
}
strstr()函数
作用:
查找子串是否存在
定义:
char * strstr ( const char * str1, const char * str2 )两个参数,str1是主串,str2是待查子串。
模拟实现:
#include <stdio.h>
//查找子串的函数
char* my_strstr(const char* str1, const char* str2) {
char* start1 = str1;
char* start2 = str2;
char* cur = str1;
while (*cur)
{
start1 = cur;
start2 = str2;
while (*start1 && *start2 && (*start1 == *start2)) {
start1++;
start2++;
}
if (*start2 == '\0') {
return (char*)cur;
}
cur++;
}
return NULL;
}
int main() {
char arr1[200] = "abadafafttabcdadrdf";
char arr2[] = "abcd";
char * ret = my_strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
memmove函数
作用:
字符串移动函数(可以自己移动自己)
定义:
void * memmove ( void * destination, const void * source, size_t num );num是需要移动的长度,单位是字节。
将从source处加上num个字节的子串移动到destination处去。
模拟实现:
void* my_memmove(void * dest,const void* src,size_t num) {//模拟实现memmove
char* s1 = (char*)dest;
char* s2 = (char*)src;
while (num) {
if (s2 < s1) {//源字串的位置小于目标字串的位置且相交
*s1 = *s2;
s1++;
s2++;
num--;
}
else if (s2 > s1) {//源字串的位置大于目标字串的位置且相交
*(s1 + num) = *(s2 + num);
num--;
}
//如果不相交,则以上两种方法任意都行,就把所有情况考虑到了都
}
}
int main() {
//模拟实现memmove
char str[100] = "abcdef";
my_memmove(str+2,str,4);
puts(str);
return 0;
}
memcpy函数
作用:
将一定数量的子串拷贝到另一个字符串中
定义:
void * memcpy ( void * destination, const void * source, size_t num );num是需要移动的长度,单位是字节。
将从source处加上num个字节的子串拷贝到destination处去。
模拟实现:
#include <stdio.h>
#include<stdlib.h>
void* my_memcpy(void* dest,const void* src,size_t num) {
char* s1 = (char*)dest;
char* s2 = (char*)src;
while (num) {
*s1 = *s2;
s1++;
s2++;
num--;
}
}
int main() {
char str1[100] = "aadgavad";
char str2[] = "asdfadsf";
my_memcpy(str1,str2,4);
puts(str1);
return 0;
}