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

相关推荐
new_zhou23 分钟前
Windows qt打包编译好的程序
开发语言·windows·qt·打包程序
ye9024 分钟前
银河麒麟V10服务器版 + openGuass + JDK +Tomcat
java·开发语言·tomcat
武昌库里写JAVA26 分钟前
Oracle如何使用序列 Oracle序列使用教程
java·开发语言·spring boot·学习·课程设计
悲伤小伞41 分钟前
linux_git的使用
linux·c语言·c++·git
showyoui1 小时前
Python 闭包(Closure)实战总结
开发语言·python
今天背单词了吗9801 小时前
算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·数据结构·笔记·算法
Eiceblue1 小时前
使用 C# 发送电子邮件(支持普通文本、HTML 和附件)
开发语言·c#·html·visual studio
小小小小王王王1 小时前
hello判断
开发语言·c#
气质、小青年!1 小时前
【排序算法】
c语言·数据结构
智者知已应修善业2 小时前
【51单片机节日彩灯控制器设计】2022-6-11
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机