C语言 模拟实现strlen函数详解

目录
  • 前言
  • 一.strlen函数的介绍
    • 1.strlen函数的声明
    • 2.strlen函数的简单运用
    • 3.注意事项
  • 二.三种实现strlen函数的方法
    • 1.计数器的方法
    • 2.递归方法
    • 3.指针-指针的方法

前言

用C语言模拟实现strlen函数,我这里有三种方法,快来看看跟你用的方法是否是一样。

一.strlen函数的介绍

1.strlen函数的声明

size_t strlen ( const char * str );

这里函数的返回值为无符号整形(size_t),传入的是一个常量char*类型的指针。

2.strlen函数的简单运用

用strlen函数可以求出字符串的长度

#include<stdio.h>
#include<string.h>
int main()
{
	char str[] = "qwerty";
	int ret = strlen(str);
	printf("字符串的长度 = %d\n", ret);
	return 0;
}

代码运行结果

3.注意事项

1.字符串是以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。

2.参数指向的字符串必须要以 '\0' 结束。

如果不是以'\0'结束,输出结果将是一个随机值,例如:

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

int main()
{
	char str[] = { 'a', 'b', 'c' };//这里没有以'\0'结束
	int ret = strlen(str);
	printf("字符串的长度 = %d\n", ret);
	return 0;
}

代码运行结果

其实这个代码的修改方法也很简单,例如:

方法1

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

int main()
{
	char str[] = { 'a', 'b', 'c', '\0'};
	int ret = strlen(str);
	printf("字符串的长度 = %d\n", ret);
	return 0;
}

方法2(如果一个数组没存满的话后面的值默认存0,而'\0'的ASCII码值就是0)

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

int main()
{
	char str[5] = { 'a', 'b', 'c'};
	int ret = strlen(str);
	printf("字符串的长度 = %d\n", ret);
	return 0;
}

代码运行结果

3.注意函数的返回值为size_t,是无符号的整形( 易错 )

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

int main()
{
	if (strlen("abc") - strlen("abcdefg") > 0)
	{
		printf(">\n");
	}
	else
	{
		printf("<=\n");
	}
	return 0;
}

运行结果

出现这个>符号的结果的原因就在于函数的返回值为size_t,是无符号的整形,两个无符号整形的数字相减得到的还是一个无符号整形,虽然这两个字符串长度相减得到的是-3,但是编译器会把他当成无符号的整形,把-3当成无符号整形将会是一个很大的正整数,所以输出的结果是>符号。(这是一个易错点)

二.三种实现strlen函数的方法

三个方法的共同点:

1.都要用const修饰指针,因为传址进来后只需要判断这字符串的长度,并不需要修改字符串的值,所以要用const修饰,这样使其更安全。

2.都要用assert断言,断言传来的指针不能为空指针,因为空指针是不能被访问的。

1.计数器的方法

这是最普通的方法,创建一个计数器变量,然后就开始找'\0',每经过一个字符,计数器就+1,直到找到'\0'为止。最后将计数器的值返回。

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

size_t my_strlen(const char* str)
{
	assert(str != NULL);//判断传入的指针是否为空指针
	int count = 0;//创建一个计数器变量,记录字符串的长度
	while (*str) //当找到'\0'的时候循环结束
	{
		count++;//记录字符串的长度
		str++;
	}
	return count;
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("%d", ret);
	return 0;
}

2.递归方法

一时递归一时爽,一直递归一直爽。(讲解全在注释里面,嘻嘻)

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

size_t my_strlen(const char* str)
{
	assert(str != NULL);//判断传入的指针是否为空指针
	if (*str)//一直递归,直到找到'\0'为止
	{
		str++;
		return (1 + my_strlen(str));//递归,并返回1+记录字符串长度
	}
	return 0;
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("%d", ret);
	return 0;
}

3.指针-指针的方法

我们都知道指针-指针的结果是他们之间元素的个数(因为这个我在指针初阶篇将过,嘻嘻),这个方法就是利用这个原理来写的。所以我们只用找到字符串首字符的地址和'\0'的地址,然后相减就可以得到字符串的长度了。

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

size_t my_strlen(const char* str)
{
	assert(str != NULL);//判断传入的指针是否为空指针
	const char* start = str;//创建一个存储首字符地址的指针,注意也要用const修饰,保持类型一致
	while (*str)//找'\0'的地址
	{
		str++;
	}
	return (str - start);//指针('\0'的地址) - 指针(首字符的地址) = 中间字符的个数
}
int main()
{
	char str[] = "qwerty";
	int ret = my_strlen(str);
	printf("字符串的长度 = %d\n", ret);
	return 0;
}

三种方法的运行结果都是一样的

到此这篇关于C语言 模拟实现strlen函数详解的文章就介绍到这了,更多相关C语言 strlen函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言中sizeof()与strlen()函数的使用入门及对比

    sizeof()函数 1,是什么?     sizeof其实就是一个运算符,和那些+,-一样的东西,在程序编译的时候进行解析转换.虽然我们经常见到sizeof后面跟着个小括号,长得和函数差不多,但它和函数完全是两码事. 2,有什么用?     sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位. 3,怎么用?     sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间.当对变量用的时

  • C语言入门篇--sizeof与strlen基础理论

    1.sizeof (1)若求字符串占据 空间 的大小,包括字符串结尾处默认的'\0'. (2)若所求不是字符串的大小,求的是数组.类型等的大小,不用考虑'\0',因为不是字符串,在结尾处无默认的'\0'. (3)若明显出现'\0',则统计. (4)返回一个变量或者类型的大小(以字节为单位) 2.strlen 求字符串内容的大小,统计字符串的字符个数,遇到'\0'停止统计,不统计'\0'. 3.知识点 3.1 对于数组 sizeof:结果就是数组大小. strlen:在计算时会遍历整个数组,往后遍

  • C语言中sizeof()与strlen()的区别详解

    前言 sizeof()和strlen()经常会被初学者混淆,但其中有有很大区别: sizeof() 1. sizeof()[操作数所占空间的字节数大小]是一种c中的基本运算符. 可以以类型.指针.数组和函数等作为参数. 头文件类型为unsigned int. 运算值在编译的时候就出结果,所以可以用来定义数组维数. char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3 sizeof()是一种单目操作符,是用来计算你所使用

  • C语言基础 strlen 函数

    目录 一.strlen 函数简介 二.strlen 函数实战 一.strlen 函数简介 在C 语言中,char 字符串也是一种非常重要的数据类型,我们可以使用 strlen 函数获取字符串长度: 字符串: 一般用一对双引号" "括起的一串字符来表示字符串常量,字符串默认以转义字符 '\0' 结尾,字符串常量是不可被修改的: strlen 函数 会扫描整个字符串,直到碰到第一个字符串结束符 '\0'为止,然后返回计数器值(长度不包含 '\0'): /* *描述: * [in] s:字符

  • C语言中strlen() strcpy() strcat() strcmp()函数的实现方法

    strlen函数原型:unsigned int strlen(const char *);返回的是字符串中第一个\0之前的字符个数. 1.strcat函数原型char* strcat(char* dest,const char* src); 进行字符串的拼接,将第二个字符串连接到第一个字符串中第一个出现\0开始的地方.返回的是拼接后字符的首地址.并不检查第一个数组的大小是否可以容纳第二个字符串.如果第一个数组的已分配的内存不够容纳第二个字符串,则多出来的字符将会溢出到相邻的内存单元. 2.str

  • C语言编程之三个方法实现strlen函数

    strlen()函数是来源于库函数<string.h> 是用于计算字符串的长度, 且字符串需要以'\0'结尾 strlen()会计算'\0'前的字符个数. 根据MSDN的描述 size_t strlen(const char* string); size_t==unsigned int; 返回-无符号整型. 现在提供三种方法实现strlen() 一.计数器法 我们是计算字符个数,可以设置一个变量,每找到一个字符,计数器就加一. int my_strlen(const char* arr)//计

  • C语言 模拟实现strlen函数详解

    目录 前言 一.strlen函数的介绍 1.strlen函数的声明 2.strlen函数的简单运用 3.注意事项 二.三种实现strlen函数的方法 1.计数器的方法 2.递归方法 3.指针-指针的方法 前言 用C语言模拟实现strlen函数,我这里有三种方法,快来看看跟你用的方法是否是一样. 一.strlen函数的介绍 1.strlen函数的声明 size_t strlen ( const char * str ): 这里函数的返回值为无符号整形(size_t),传入的是一个常量char*类型

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • C语言的随机数rand()函数详解

    在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void); rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(); p

  • C语言模拟实现atoi函数的实例详解

    C语言模拟实现atoi函数的实例详解 atoi函数,主要功能是将一个字符串转变为整数,例如将"12345"–>12345.但在实现过程中,我们难免会因为考虑不够全面而漏掉比较重要的几点,今天就总结一下实现atoi函数需要注意的地方. 1.指针为NULL 2.字符串为空字符串 3.空白字符 4.正号与负号问题 5.溢出问题 6.异常字符处理 接下来看代码:(具体几种问题处理都在代码的注释中说明) #define _CRT_SECURE_NO_WARNINGS 1 #include

  • C语言 模拟实现memcpy与memmove函数详解

    目录 一.memcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现memcpy函数 1.模拟分析 2.模拟实现 三.memmove函数的介绍 1.函数的声明 2.为什么会有memmove函数 3.函数功能与注意事项 4.函数的使用 四.模拟实现memmove函数 1.模拟分析 2.模拟实现 一.memcpy函数的介绍 1.函数的声明 void * memcpy ( void * destination, const void * source, size_t

  • C语言 模拟实现strcpy与strcat函数详解

    目录 一.strcpy函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 二.模拟实现strcpy函数 1.模拟分析 2.模拟实现 三.strcat函数的介绍 1.函数的声明 2.函数功能与注意事项 3.函数的使用 四.模拟实现strcat函数 1.模拟分析 2.模拟实现 总结 这里有超详细的函数模实现分享,带大家一起来模拟实现这些函数,后续还将更新更多的函数模拟实现的文章. 一.strcpy函数的介绍 1.函数的声明 char* strcpy(char * destinatio

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • C语言头文件<string.h>函数详解

    目录 1. strlen —— 求字符串长度 1.1 strlen 的声明与用处 1.2 strlen 的用法 1.3 strlen 的模拟实现 2. strcpy —— 字符串拷贝 2.1 strcpy 的声明与用处 2.2 strcpy 的用法 2.3 strcpy 的模拟实现 3. strcmp —— 字符串比较 3.1 strcmp 的声明与用处 3.2 strcmp 的用法 3.3 strcmp 的模拟实现 4. strcat —— 字符串追加 4.1 strcat 的声明与用处 4.

  • C语言文件操作中 fgets与fputs 函数详解

    C语言文件操作中 fgets.fputs 函数详解 先给出api fgets 语法: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); 函数fgets()从给出的文件流中读取[num - 1]个字符并且把它们转储到str(字符串)中. fgets()在到达行末时停止,在这种情况下,str(字符串)将会被一个新行符结束. 如果fgets()达到[num - 1]个字符或者遇到EOF, str(字符串)将会以nu

  • R语言学习笔记之lm函数详解

    在使用lm函数做一元线性回归时,发现lm(y~x+1)和lm(y~x)的结果是一致的,一直没找到两者之间的区别,经过大神们的讨论和测试,才发现其中的差别,测试如下: ------------------------------------------------------------- ------------------------------------------------------------- 结果可以发现,两者的结果是一样的,并无区别,但是若改为lm(y~x-1)就能看出+1和

随机推荐