C语言字符函数和字符串函数

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 比较的是内存区域的二进制内容,而不是字符内容。因此,它适用于任何形式的二进制数据。适用于比较任何形式的二进制数据。它不仅限于字符串,还可以用于数组、结构体等复杂数据类型的比较

相关推荐
JAMES费8 分钟前
python机器人Agent编程——多Agent框架的底层逻辑(上)
开发语言·python·机器人
JovaZou24 分钟前
[Python学习日记-67] 封装
开发语言·python·学习
hlsd#24 分钟前
go 集成swagger 在线接口文档
开发语言·后端·golang
Java Fans30 分钟前
深入探索R语言在机器学习中的应用与实践
开发语言·机器学习·r语言
草原上唱山歌35 分钟前
C++需要学习哪些内容?
开发语言·c++·学习
lly20240641 分钟前
SQLite Where 子句
开发语言
Clrove.111 小时前
C++初阶——queue
开发语言·c++
挥剑决浮云 -1 小时前
Linux 网络编程
linux·运维·c语言·网络·笔记
析木不会编程1 小时前
【数据结构】【线性表】循环链表(附C语言源码)
c语言·数据结构·链表
写bug的小屁孩1 小时前
基于HTTP编写ping操作
服务器·c语言·网络·c++·网络协议·http·qt6.3