C语言字符串函数介绍与模拟实现详解

目录
  • 2. strcpy(复制字符串)
    • 2.1 strncpy函数
    • 2.2 模拟实现strcpy
  • 3. strcat (追加字符)
    • 3.1 strncat 函数
    • 3.2 模拟实现strcat
  • 4. strcmp(比较两个字符串内容)
    • 4.1 strncmp函数
    • 4.2 模拟实现strcmp
  • 5. strstr (返回str1出现在str2位置处第一次的指针)
    • 5.1 模拟实现strstr
  • 6. strtok(分割字符串)
  • 总结

1. strlen(求字符串长度)

这个函数就是求一个字符串的长度。

注意它是不算'\0'的,即以'\0'为结束标志,计算其之前的字符串长度,但不能没有'\0'.

让我们来一个有趣的例子:

int main()
{
	if (strlen("abc") - strlen("abcdef"))
		printf("hehe");
	else
		printf("haha");
	return 0;
}

以上的代码乍一眼看是3 - 6 = -3,应该输出haha

但是strlen函数返回的是无符号整型,所以-3被看作无符号整数,应该是一个大于0的数。

1.1 strlen 模拟实现

那么这个函数自己来写应该怎样实现呢?

模拟实现需要考虑到所有情况:

所以 const 防止改变字符串与 assert 防止传入空指针不可少。

size_t my_strlen(const char* a)
{
	assert(a);
	int count = 0;
	while (*a)
	{
		count++;
		a++;
	}
	return count;
}

2. strcpy(复制字符串)

这个函数用于把一个字符串内容赋给另一个字符串内,如果目的字符串有内容,直接覆盖。

注意点:strcpy复制字符串从arr2到arr1

被复制的字符串一定要带'\0',因为这个是结束标志

目标空间也要足够大且可变(可变:用数组写,而非指针卡死)

int main()
{
	char arr1[] = "xxxxxxxxxxxxxxx";
	//char *p = "xxx";//不可变且空间小
	char arr2[] = "abcd\0efg";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

2.1 strncpy函数

这个函数是不是很相像?由于strcpy 直接将一个字符串完全复制过去,

那么有没有一个函数能只复制一部分呢?此函数就是充当这个作用的。

它将 num 个字符从源字符串中取出,放入目的字符串。

int main()
{
	char a[] = "abcde";
	char b[] = "abc";
	strncpy(a, b, 6);
	printf("%s", a);
	return 0;
}

如果遇到源字符串不够的情况,会自动补0.

2.2 模拟实现strcpy

char* my_strcpy(char* a1, const char* a2)//原指针被修改,不加const
{
	assert(a1 && a2);
	char* ret = a1;
	while (*a1++ = *a2++)
	{
		;
	}
	return ret;
}

来解释一下这个写法(*a1++ = *a2++ ):

先把a2赋给a1,然后各自++。当a2为0时,这个表达式值为0,就退出循环。

因为值放在地址内,所以a1的地址给ret存好后,最后返回ret的地址就是返回a1的值.

3. strcat (追加字符)

传入两个字符串,将后一个字符串追加到前一个字符串上。

源字符串必须要有 '\0' 作为结束标志,且目标字符串足够大且可变。(提前定义目标数组大小)

如果需要自己给自己追加,那么就使用这个函数。

3.1 strncat 函数

就是将源字符串 num 个字符追加到目标字符串上,如下图:

3.2 模拟实现strcat

char* my_strcat(char* a, const char* b)
{
	assert(a && b);
	char* p = a;
	//先找到a字符串为'\0'的位置
	while (*a)
	{
		a++;
	}
	while (*a++ = *b++)
	{
		;
	}
	return p;
}

4. strcmp(比较两个字符串内容)

传入两个字符串,比较两个字符串。

str1 > str2 返回正数; = 返回0; < 返回负数

那么是怎么比较的呢?

记住是比较不相同的那个字符大小,跟长度没有一点关系。

如图就是比较 'e' 和 'q' 的字符大小,明显 'q' 更大,所以返回 -1.

4.1 strncmp函数

和strncpy相似,就是将两个字符串前num个字符比较,规则同 strcmp 函数 。

4.2 模拟实现strcmp

int my_strcmp(const char* a, const char* b)
{
	assert(a && b);
	while (*a == *b)
	{
		if (*b == '\0')
			return 0;
		a++;
		b++;
	}
	/*if (*a > *b)
		return 1;
	if (*a < *b)
		return -1;*/
	return *a - *b;//这样一步到位
}

5. strstr (返回str1出现在str2位置处第一次的指针)

就是返回b字符串在a中第一次出现的位置的指针,如下就会打印 am a student.

如果没有找到就返回空指针。

int main()
{
	char a[] = "I am a student.";
	char b[] = "am";
	printf("%s", strstr(a, b));
	return 0;
}

5.1 模拟实现strstr

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	char* s1;
	char* s2;
	char* cp = str1;
	if (*str2 == '\0')//如果传入了""
		return str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

6. strtok(分割字符串)

这个函数能以我们所需分割字符串,sep是分割的标志,str是被分割的字符串。

下面来一个例子:

int main()
{
	char a[] = "123@qq.com";
	char b[] = "@.";
	printf("%s\n", strtok(a, b));//分割了123
	printf("%s\n", strtok(NULL, b));//分割了qq
	printf("%s\n", strtok(NULL, b));//分割了com
	return 0;
}

第一次分割完,之后这个函数会记住分割的位置,把目标函数的分割标志变为'\0'

所以这个函数会修改字符串,要小心使用。

下次使用只需要传入空指针,这是这个函数的重点。

我们也可以使用循环来表达它的结果:

int main()
{
    char *p = "666@qq.com";
    const char* sep = ".@";
    char arr[30];
    char *str = NULL;
    strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
    for(str=strtok(arr, sep); str != NULL; str=strtok(NULL, sep))
    {
        printf("%s\n", str);
    }
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C语言字符函数与字符串函数详解

    目录 本章重点 前言 1.strlen函数 注意点1 注意点2 2.strcpy 注意点1: 注意点2: 注意点3: 注意点4: 总结 本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 1.求字符串长度 strlen 2.长度不受限制的字符串函数 strcpy ,strcat, strcmp 3.长度受限制的字符串函数 strncpy,strncat ,strncmp 4.字符串查找 strstr,strtok 5.错误信息报告 strerror 6.字符操作 7.内存操作函数 mem

  • c语言重要的字符串与内存函数

    目录 一.字符串函数 1. 求字符串长度的strlen 2.比较字符串大小的strcmp 3.复制字符串的strcpy 4.追加字符串的strcat 5.查找字符串函数的strstr 二.内存函数 1.复制 memcpy,memmove 2.比较 memcmp 一.字符串函数 1. 求字符串长度的strlen size_t strlen ( const char * str ); 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0'

  • C语言的字符串函数,内存函数笔记详解

    目录 strlen strlen模拟实现 strcpy strcpy的模拟实现 strcat strcat的模拟实现 strcmp strcmp模拟实现 strstr strstr模拟实现 strncpy strncat strncmp strtok memcpy memcpy模拟实现 memmove memmove模拟实现 memcmp 字符分类函数 字符串换函数 总结 strlen 此函数接收一个char*类型参数,返回字符串\0前字符数,注意返回类型是size_t型的 //关于strlen

  • C语言不使用strcpy函数如何实现字符串复制功能

    Ⅰ )字符串复制函数 字符串复制是字符串操作中比较常用的操作之一.C语言库函数中提供的字符串复制函数是:strcpy函数.该函数的功能为:把源字符数组中的字符串复制到目的字符数组中,字符串结束标志"\0"也一同复制.下面实例为通过自定义函数完成字符串复制功能. Ⅱ)源代码: #include<stdio.h> void Copy_string(char* str1, char* str2); //函数声明 int main() { char str1[20]; char s

  • C语言字符函数、内存函数功能及实现代码

    C语言字符函数.内存函数 功能及实现 strlen函数(求字符串长度)注意点模拟实现 strcpy函数(字符串拷贝函数)注意点模拟实现 strcat函数(字符串衔接函数)注意点模拟实现 strcmp函数注意点模拟实现 strstr函数模拟实现 strtok函数使用 strerror函数使用 memcpy函数注意点模拟实现 memmove函数注意点模拟实现 memset函数注意点 strlen函数(求字符串长度) 统计字符串长度直到\0为止 注意点 1.属于<string.h>库 2.参数为字符

  • C语言的编程之美之内存函数

    目录 内存函数 memcpy内存拷贝 原格式 分析 内存拷贝的问题 memmove内存重叠拷贝 C语言规定 原格式 分析 memset内存设置 原格式 memcmp内存比较 原格式 总结 内存函数 memcpy内存拷贝 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置. 这个函数在遇到 '\0' 的时候并不会停下来. 如果source和destination有任何的重叠,复制的结果都是未定义的. 原格式 分析 **字面上意思只要是内存里面的东西

  • C语言进阶教程之字符串&内存函数

    目录 前言: 一.求字符串长度 strlen strlen函数的模拟实现 二.长度不受限制的字符串函数 strcpy strcpy函数的模拟实现 strcat strcat函数的模拟实现 strcmp strcmp函数的模拟实现 三.长度受限制的字符串函数 strncpy strncpy函数的模拟实现 strncat strncat函数的模拟实现 strncmp strncmp函数的模拟实现 四.字符串查找 strstr strstr函数的模拟实现 strtok strtok函数的模拟实现 五.

  • C语言字符串旋转问题的深入讲解

    目录 字符串的旋转: 实现旋转字符串: 1.暴力求解法: 2.三步翻转法 判断一个字符串是否由另一个字符串旋转而来 1.暴力求解法: 2.优化算法: 关于用到的函数扩展: 1.assert 2.strcmp 3.strcat 4.strncat 5.strstr 总结 字符串的旋转: ABCD左旋一个字符为BCDA ABCD左旋两个字符为CDAB ABCD右旋一个字符为DABC ABCD右旋两个字符为CDAB 这里只写了左旋,右旋的原理和左旋一样. 实现旋转字符串: 1.暴力求解法: 思路: 假

  • C语言字符串函数介绍与模拟实现详解

    目录 2. strcpy(复制字符串) 2.1 strncpy函数 2.2 模拟实现strcpy 3. strcat (追加字符) 3.1 strncat 函数 3.2 模拟实现strcat 4. strcmp(比较两个字符串内容) 4.1 strncmp函数 4.2 模拟实现strcmp 5. strstr (返回str1出现在str2位置处第一次的指针) 5.1 模拟实现strstr 6. strtok(分割字符串) 总结 1. strlen(求字符串长度) 这个函数就是求一个字符串的长度.

  • R语言which函数介绍及Rcpp改写详解

    目录 引言 which 函数的介绍 which函数的一些小例子 which函数的改进以及时间对比 总结 引言 首先来介绍一下R语言which函数的作用:which函数在向量.矩阵.数据框,列表.因子这些数据结构中有这重要的作用,可以查找特定的元素返回其在数据中的索引,因此非常方便操作数据. which 函数的介绍 which函数中的参数: function (x, arr.ind = FALSE, useNames = TRUE) which函数的源码: which <- function(x,

  • Go语言中函数可变参数(Variadic Parameter)详解

    目录 基本语法 示例一:函数中获取可变参数 示例二:将切片传给可变参数 示例三:多参数 基本语法 在Python中,在函数参数不确定数量的情况下,可以使用如下方式动态在函数内获取参数,args实质上是一个list,而kwargs是一个dict def myFun(*args, **kwargs): 在Go语言中,也有类似的实现方式,只不过Go中只能实现类似*args的数组方式,而无法实现**kwargs的方式.实现这种方式,其实也是利用数组的三个点表达方式,我们这里来回忆一下. 关于三个点(…)

  • Go语言基础函数基本用法及示例详解

    目录 概述 语法 函数定义 一.函数参数 无参数无返回 有参数有返回 函数值传递 函数引用传递 可变参数列表 无默认参数 函数作为参数 二.返回值 多个返回值 跳过返回值 匿名函数 匿名函数可以赋值给一个变量 为函数类型添加方法 总结 示例 概述 函数是基本的代码块,用于执行一个任务 语法 函数定义 func 函数名称( 参数列表] ) (返回值列表]){ 执行语句 } 一.函数参数 无参数无返回 func add() 有参数有返回 func add(a, b int) int 函数值传递 fu

  • Python字符串函数strip()原理及用法详解

    strip:用于移除字符串头尾指定的字符(默认为空格)或字符序列.注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符. 语法:str.strip([chars]) str = "*****this is **string** example....wow!!!*****" print (str.strip( '*' )) # 指定字符串 * 输出结果: this is **string** example....wow!!! 从结果上看,可以注意到中间部分的字符并未删除,只

  • C语言时间函数之mktime和difftime详解

    目录 mktime函数 difftime函数 总结 这两个函数原型如下: __CRT_INLINE time_t __cdecl mktime(struct tm *_Tm); __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2); mktime函数 mktime函数会把参数把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数,如果发生错误时则返回-1. 参数结构体原型如下: str

  • C语言字符串函数,字符函数,内存函数使用及模拟实现

    目录 求字符串长度 strlen 长度不受限制的字符串函数 strcpy strcat strcmp 长度受限制的字符串函数 strncpy strncat strncmp 字符串查找函数 strstr strtok strerror 字符函数 字符分类函数 字符转换函数 内存操作函数 memcpy memmove memcmp memset 求字符串长度 strlen 函数功能 字符串长度,求一个字符串中字符的个数(不包含’\0’). 函数参数: size_t strlen( const ch

  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    目录 一.strlen函数模拟 二. strcpy函数模拟  三.strcat函数模拟 四.strcmp函数模拟 总结 一.strlen函数模拟 字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数(不包括'\0'); 有三种方法可以实现该操作: ①计数器方式 ②不能创建临时变量计数器 ③指针-指针  方法一:计数器方式 int my_strlen(const char* str) { int count = 0;//定义count用来记录字符串数组中字符数

  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    目录 一.strlen函数模拟 二. strcpy函数模拟 三.strcat函数模拟 四.strcmp函数模拟 总结 一.strlen函数模拟 字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包括‘\0’); 有三种方法可以实现该操作: ①计数器方式 ②不能创建临时变量计数器 ③指针-指针 方法一:计数器方式 int my_strlen(const char* str) { int count = 0;//定义count用来记录字符串数组中字符数 w

  • C语言字符串函数与内存函数精讲

    目录 strlen strcpy strcat strcmp strncpy strncat strncmp strstr strtok strerror tolower\toupper memcpy memmove memcmp memset strlen 获取字符串长度. strlen - size_t strlen( const char *string ); 1.字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符个数(不包含’\0’). 2.参数指向的

随机推荐