1.strlen(求字符串长度)
要有头文件 #include <string.h>h
字符串以'\0'作为结束标志,strlen函数返回字符串中'\0'前面出现的字符个数(不包含'\0'),函数返回值是无符号的
因为返回的是无符号数,所以一定是正数大于0
参数指向的字符串要以'\0'结束
size_t strlen (const char* str);
2.模拟实现strlen
assert断言 (指针是否是空指针)
1)计数器
#include <stdio.h>
#include <string.h>
#include <assert.h>
int mystrlen(const char*str){
int count=0;
assert(str);
while(*str!='\0'){
count++;
str++;
}
return count;
}
int main(){
char arr[]="hello";
int len=mystrlen(arr);
printf("%d\n",len);
return 0;
}
2)递归 (不创建临时变量,求字符串长度)
int mystrlen(const char*str){
if(*str!='\0')
return 1+mystrlen(str+1);
else
return 0;
}
3)指针-指针
const char*des=str;
while(*str!='\0'){
str++;
}
int count=str-des;
return count;
}
2.strcpy
拷贝
char * strcpy(char * destination,const char * source)
源字符串必须以'\0'结束,源字符串中的'\0'也会拷贝到目标空间,目标空间要足够大且可变
2.模拟实现
char*mystrcpy(char *dest,const char*src){
assert(dest&&src);
char*ret=dest;//返回目标空间起始地址
while(*dest++=*src++){
;
}
return ret;
}
int main(){
char arr1[]="haha";
char arr2[20]={0};
mystrcpy(arr2,arr1);
printf("%s",arr2);
return 0;
}
3.strcat(追加)
char * strcat(char * destination,const char * source)
从目标字符串的'\0'位置开始追加,并把自己的'\0'也添加到目标字符串
2.模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char *mystrcat(char* dest,const char*src){
assert(dest&&src);
char*ret=dest;
while(*dest!='\0'){
dest++;
}
while(*dest++=*src++){
;
}
return ret;
}
4.strcmp(字符串比较)
int strcmp (const char *str1,const char*str2)
比较规则:第一个字符串大于第二个字符串(比较对应的字符)返回大于0的数,等于返回0,小于返回小于0的数;
2.模拟实现
assert(str1 && str2);
while(*str1==*str2){
if(*str1=='\0')
return 0;
str1++;
str2++;
}
if(*str1>*str2)
return 1;
else
return -1;
}
5.strncpy
char* strncpy(char *destination,const char *source,size_t num);
拷贝num个字符到目标空间,如果源字符串的长度小于num,则在后边追加0,直到num个
6.strncat
char* strncat(char *destination,const char *source,size_t num);
7.strncmp
int strncmp(const char*str1,const char*str2,size_t num);
8.strstr
char * strstr(const char*str1,const char*str2);
( 用于查找一个字符串在另一个字符串中的首次出现位置)
- 如果找到了 str2子串,
strstr
函数会返回指向 str1 中第一次出现 str2 的位置的指针。 - 如果没有找到 str2,或者 str2 是空字符串(只包含终止符
\0
),则返回 str1本身
9.strtok
char* strtok(char * str,const char* sep);
strtok
函数用于将字符串分割成一系列的子字符串(标记)
sep参数字符串,定义了用作分隔符的字符集合
str
:这是要分割的原始字符串。在首次调用 strtok
时,应提供完整的字符串;在后续调用中,应该传入 NULL
,这表示继续使用上次调用 strtok
后剩余的部分进行分割
strtok
返回指向下一个标记(子字符串)的指针。strtok
返回指向下一个标记(子字符串)的指针。
10.strerror
strerror
函数用于将错误代码转换为对应的错误消息字符串,通常与 <errno.h>
头文件一起使用,因为错误代码通常保存在 errno
变量中。
11.memcpy
void *memcpy(void *dest, const void *src, size_t n);
memcpy
函数用于在内存中复制一块数据
dest
:目标地址,即要复制到的内存区域的起始地址。src
:源地址,即要复制的内存区域的起始地址。n
:要复制的字节数
memcpy
返回指向目标内存区域 dest
的指针
12.memmove
void *memmove(void *dest, const void *src, size_t n);
memmove
函数用于在内存中复制一块数据,与 memcpy
类似,但它允许源和目标内存区域重叠。
memmove
允许源和目标内存区域重叠。它会正确处理重叠的情况,确保数据不会被意外覆盖
#include <stdio.h>
#include <string.h>
int main() {
char str[50] = "Hello, world!";
// 将 "world!" 移动到 "Hello, " 的位置
memmove(str + 7, str + 13, 6);
printf("String after memmove: %s\n", str);
return 0;
}
13.memcmp
int memcmp(const void *s1, const void *s2, size_t n);
memcmp
函数用于比较两个内存区域的内容,
s1
:指向第一个内存区域的指针。s2
:指向第二个内存区域的指针。n
:要比较的字节数
- 如果两个内存区域的前
n
个字节完全相同,memcmp
返回 0。 - 如果
s1
的前n
个字节小于s2
的前n
个字节,memcmp
返回一个小于 0 的值。 - 如果
s1
的前n
个字节大于s2
的前n
个字节,memcmp
返回一个大于 0 的值
memcmp
比较的是内存区域的二进制内容,而不是字符内容。因此,它适用于任何形式的二进制数据。适用于比较任何形式的二进制数据。它不仅限于字符串,还可以用于数组、结构体等复杂数据类型的比较