轻松掌握C语言的简单字符串函数

hello,各位小伙伴,欢迎大家的到来,本篇文章将会跟大家一起来学习C语言的简单字符串函数和内存函数,并带着大家简单模拟实现某部分函数

如果觉得有帮助,希望大家能点点赞!!!

1.strlen函数的使用和模拟实现

strlen的语法

strlen函数是比较常用的函数,用来求字符串的长度,在使用之前呢,我们需要包含一个头文件:<string.h>,然后我们将字符串的地址传给strlen,然后strlen就会返回一个整型的值,这个值就是字符串的长度,话不多说,先来看代码:

#include<string.h>
#include<stdio.h>
int main()
{
	char a[] = "abcdef";
	int ret = 0;
	ret = strlen(a);//将a的地址传给strlen
	return 0;
}

最后得到的结果就是:6

strlen的基本原理

我们知道字符串末尾是自带'\0'的,当strlen接收到字符串的地址时,strlen会从该地址开始一个一个字符的计数,直到strlen读到字符‘\0’时,就会停止计数,这里strlen并没有把字符'\0'计数喔,要注意!

strlen的模拟实现

知道strlen的基本原理后,我们就可以简单模拟实现strlen啦

传给strlen的参数是字符串的地址,并且返回类型为整型。所以我们需要创建一个指针变量来接受,并且用(int)来定义函数的返回类型。注:这里的my_strlen将作为我的strlen模拟实现的函数:

int my_strlen(char *str)

strlen是一直向后读取数据的,所以我们可以使用循环,将字符串的数组遍历一遍,每遍历一个字符就计数一次,所以我们还需要创建一个变量来计数,最终返回count的值:

int my_strlen(char *str)
{
    int count = 0;//创建count来计数
    while(*str!='\0')//使用指针遍历字符串元素
    {
        str++;//使每个字符都遍历一遍
        count++;
    }
    return count;//将count的值返回就是字符串的长度
}

2.strcpy的使用和模拟实现 

strcpy函数也是需要包含头文件:<string.h>,是用来拷贝字符串的,是将一整个字符串拷贝到另一个字符串里头去,什么意思呢,看图:

无论你拷贝的字符串(源字符串)有多长,都会直接拷贝另一个字符串(目标字符串),如上图:arr1的字符串被arr2覆盖,那为什么打印出来的结果只有jkl呢,arr1后面的字符呢?别急,带着这个疑问,我们一步一步来

strcpy的语法 

strcpy需要两个参数,两个参数都是字符串的地址,第一个为被拷贝覆盖的字符串,第二个为拷贝的字符串,

char* strcpy(char * destination, const char * source );

但是是有要求的:

1.源字符串必须以 '\0' 结束

2.⽬标空间必须⾜够⼤

3.以确保能存放源字符串。

strcpy的基本原理 

strcpy是把第二个字符串中的第一个字符开始,拷贝到第一个字符串,直至第二个字符串完全拷贝结束,也就是拷贝到字符'\0'时停下来,这里的字符'\0'是会被拷贝的喔,要注意!

想必有些小伙伴已经明白,为什么上面我们所讲的疑惑了(为什么打印出来的结果只有jkl呢,arr1后面的字符呢?)没错,因为strcpy是会把源字符串里的字符'\0'拷贝过去的,又因为%s遇到'\0'会停止,所以'\0'后面的字符将不再打印。拷贝完后将会返回第一个字符串的地址 

strcpy的模拟实现  

我们还是需要创建指针来接受字符串的地址,定义函数类型为char* 。上代码:

#include<stdio.h>
#include<assert.h>

char* my_strcpy(char* str1, const char* str2)
{
	assert(str2&&str1);//assert断言判断str2和str1是否为空指针
	char* ret = str1;//因为strcpy要返回的值为str1首元素的地址,我们要记下
	while (*str1++=*str2++)//利用循环,将str2中的字符复制到str1,包括字符'\0'
	{
		;
	}
	return ret;返回str1首元素的地址
}

3.strcat 的使用和模拟实现

strcat的语法

char *strcat(char *dest, const char*src)

 strcat函数也是需要包含头文件:<string.h>,strcat函数和strcpy有点像,strcat是在目标字符串后面拷贝源代码,也是要传递两个参数,条件:

• 源字符串必须以 '\0' 结束。

• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

• ⽬标空间必须可修改。

strcat的基本原理

strcat会从目标字符串的'\0'开始,将源代码的字符拷贝到目标字符串中,并且当拷贝到源字符串的'\0'时停止拷贝

strcat的模拟实现 

同样,我们要创建两个指针来接受目标字符串和源字符串的地址,定义函数类型为char* 。上代码:

char* my_strcat(char* str1, const char* str2)
{
	assert(str2&&str1);
	const char* tmp = str1;//同样记下str1的首元素地址
	while (*str1)//通过循环来找到str1指向'\0'的地址
	{
		str1++;
	}
	while (*str2)//一直拷贝到str2的'\0'停下
	{
		*str1 = *str2;//拷贝
		str2++;
		str1++;
	}
	*str1 = *str2;//将str2的'\0'拷贝过去
	return (char*)tmp;返回str1首元素地址
}

4.strcmp 的使用和模拟实现

 strcmp的语法

int strcmp (const char * str1, const char * str2)

strcmp函数也是需要包含头文件:<string.h>,条件:

strcmp是用来比较字符串的,但不是比较字符串长度的喔,要注意! 举个例子:

在strcmp函数中,abq>abcdef

因为strcmp是一个一个字符比较大小的,如上述例子,q>c,所以abq>abcdef,就这么简单,并没有很复杂,使用strcmp函数也是要传递两个参数

strcmp的基本原理 

strcmp会从两个字符串第一个字符开始比较,直至分出结果或者两个字符串都同时读取到'\0'时停下,注意:'\0'与其他字符比较都是较小的 当第一个字符串>第二个字符串时,会返回一个正数,小于时会返回一个负数,等于时会返回0

strcmp的模拟实现

同样,我们要创建两个指针来接受两个字符串的地址,定义函数为整型类型,上代码:

#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
//因为我只是比较两个字符串的大小,并不想改变他们,所以用const修饰
{
	assert(str1, str2);//判断是否为空指针
	while (*str1++ && *str2++)//遍历两个字符串,直至得出结果
	{
		if (*str1 > *str2)
			return 1;
		else if (*str1 < *str2)
			return -1;
	}
	if (*str1 == '\0')//当上述while循环得不到结果时,也就是两字符串相等,
          return 0;  //并且两指针已经走到'\0'的位置
}

5.strncpy 函数的使用

 char * strncpy ( char * destination, const char * source, size_t num );

 需要包含头文件:<string.h>,其实就比strcpy多了一个参数,限制了拷贝字符串的长度,源代码小于num时追加0

• 拷贝num个字符从源字符串到⽬标空间。

• 如果源字符串的长度小于num,则拷贝完源字符串之后,在⽬标的后边追加0,直到num个。

6.strncat 函数的使用 

 char * strncat ( char * destination, const char * source, size_t num );

 需要包含头文件:<string.h>,其实就比strcat多了一个参数

• 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符。

• 如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾。

 举个实例:

int main()
{
	char arr1[10] = "hello ";
	char arr2[10] = "world";
	strncat(arr1, arr2,3);
	printf("%s\n", arr1);
	return 0;
}

看结果: 

strncat只将world前3个字符拷贝过去了

7.strncmp函数的使用 

int strncmp ( const char * str1, const char * str2, size_t num );

  需要包含头文件:<string.h>,其实就比strcmp多了一个参数

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

8.strstr 的使用和模拟实现 

 strstr的语法

char * strstr ( const char * str1, const char * str2)

strstr函数也是需要包含头文件:<string.h>,是在目标字符串中查找源字符串,所以也是要传递两个参数

strstr的基本原理

strstr会遍历整个目标字符串直至得出结果,当目标字符串出现与源字符串首字符相同的字符时,就会记录当前的位置(就当记作p),并且继续对比 两字符串的字符,如果在遍历完源字符串//不包括'\0'//(即对比完源字符串)前发现不一样的字符,则从p下一个字符继续遍历,如在目标字符串遍历结束前发现源字符,则结束遍历,并返回p位置的地址;若没有找到源字符,则返回空指针

strstr的模拟实现

 同样,我们需要创建两个指针来接受参数,定义函数为void类型,话不多说,上代码:

void my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);//判断是否为空指针
	char* cur = str1;//cur作为在str1当前检索位置
    int flag = 1;//标记是否存在源字符串
	while (*cur)//遍历目标字符串
	{
		char* s1 = cur;
		char* s2 = str2;
        //s1为目标字符检索指针,s2为源字符串指针指向位置(用来检索s1是否与源字符串一样)
		while (*s1 == *s2)//当发现目标字符与源字符串首字符一样时,
                          //开始查看目标字符串是否存在源字符串
		{
			s1++;
			s2++;//开始遍历源字符串
			if (*s2 == '\0')//当s2已经指向源字符串的末尾'\0'时,说明目标字符串存在源字符串
			{
				printf("%s\n", cur);
				flag = 0;//标记目标字符串存在源字符串
				break;。。跳出循环
			}
		}
			cur++;
	}
	if (*cur == '\0'&&flag)//说明目标字符串已将遍历完,并且找不到源字符串
		printf("找不到\n");

9. strtok 函数的使用

char * strtok ( char * str, const char * sep);

 strtok函数也是需要包含头文件:<string.h> ,并需要传递两个参数

strtok的基本原理

• sep参数指向⼀个字符串,定义了用作分隔符的字符集合

• 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标 记。

• strtok函数找到str中的下⼀个标记,并将其用 \0 结尾,返回⼀个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷贝的内容 并且可修改。)

• strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串 中的位置。

• strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标 记。

• 如果字符串中不存在更多的标记,则返回 NULL 指针。

 举个例子:qq邮箱:zhangsan@qq.com  ,是由 和 两个字符将zhangsan、qq、com  ,分割开的,那么我要获取的数据不需要这些字符,strtok就能做到提取出来,strtok会把@.变为字符'\0',但是我们只是想得到数据,并不像改变它原有的样子,所以我们一般会拷贝一份一模一样的,并用拷贝的放进函数

由于strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。,所以我们再打印数据时,会这样打印:

#include <stdio.h>
#include <string.h>
int main()
{
 char arr[] = "192.168.6.111";
 char* sep = ".";
 char* str = NULL;
 for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
 //strtok每次都会保留在上一次记录的位置
 {
 printf("%s\n", str);
 }
 return 0;
}

10.strerror 函数的使用

char * strerror ( int errnum );

 strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

举个例子:0~9的错误信息 

#include <errno.h>
#include <string.h>
#include <stdio.h>

int main()
{
 int i = 0;
 for (i = 0; i <= 10; i++) {
 printf("%s\n", strerror(i));
 }
 return 0;
}

打印结果: 

0:No error

1:Operation not permitted

2:No such file or directory

3:No such process Interrupted function call

4:Input/output error

5:No such device or address

6:Arg list too long

7:Exec format error

8:Bad file descriptor

9:No child processes

  • 34
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值