C语言-字符串函数的实现(一)之strlen

2021年09月15日 阅读数:1
这篇文章主要向大家介绍C语言-字符串函数的实现(一)之strlen,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

C语言中的字符串函数有以下这些数组

  • 获取字符串长度
    • strlen
  • 长度不受限制的字符串函数
    • strcpy
    • strcat
    • strcmp
  • 长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 错误信息报告
    • strerror

接下来看看如何实现它们ide

获取字符串长度

strlen

咱们看看文档是怎样说的,以下函数

strlen文档lua

size_t strlen ( const char * str );

Get string length指针

获取字符串长度递归

Returns the length of the C string str.文档

返回C字符串str的长度字符串

The length of a C string is determined by the terminating null-character: A C string is as long as the number of characters between the beginning of the string and the terminating null character (without including the terminating null character itself).string

C字符串长度是由'\0'来肯定的,也就是说从字符串的第一个开始只要遇到'\0'就结束长度计算(不包含'\0')it

This should not be confused with the size of the array that holds the string. For example:

不用困惑你建立的数组的大小,好比这样

char mystr[100]="test string";

defines an array of characters with a size of 100 chars, but the C string with which mystr has been initialized has a length of only 11 characters. Therefore, while sizeof(mystr) evaluates to 100, strlen(mystr) returns 11.

定义一个大小为100的数组mystr,而后mystr 就已经被初始化为一个长度为11的字符串了。因此呢, sizeof(mystr) 会得出 100, 而strlen(mystr) 会返回 11.

综上,能够知道

  1. 字符串已经 '\0' 做为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  2. 该函数只认'\0',参数指向的字符串必需要以 '\0' 结束。
  3. 注意函数的返回值为size_t,是无符号的

实现

strlen函数的实现有好几种。

好比

  1. 计数器的方法
  2. 递归
  3. 指针 - 指针

接下来一一实现。

1. 计数器:使用一个变量来记录 - count

断言指针不为空是个好习惯~

int my_strlen(char* str) 
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0') // while (*str)
	{
		count++;
		str++;
	}
	return count;
}

就一直找'\0',当*str不是'\0'时,就count++,str++,直到遇到'\0'中止,而后返回count就是长度了。

2. 递归

断言指针不为空是个好习惯~

int my_strlen(char* str)
{
    assert(str != NULL);
    char* p = str;
    while(*p == '\0')
    {
        return 0;
    }
    return 1 + my_strlen(p + 1);
}

好比传入的str地址为 1000

那么 1 + my_strlen(p + 1) 中,p + 1,指针偏移后就是1001,以此类推。

1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + my_strlen(p + 1)

1 + 1 + 1 + 1 + my_strlen(p + 1)

...

1 + 1 + 1 + 1 + ... + 0

最终就能够得出长度。

3. 指针-指针

断言指针不为空是个好习惯~

int my_strlen(char* str) 
{
    assert(str != NULL);
	char* p = str;
	while (*p != '\0') 
	{
		p++;
	}
	return p - str;
}

把指针str的地址赋值给一个新的指针p,str做为指向起始地址的指针,不改变它,记录起始地址。

而后经过指针p进行查找'\0',判断当前字符是否为'\0',不是就进行p++,而后继续判断下一个字符,如此循环,直到指针p找到'\0',而后用   当前的指针p  减去  起始指针str 进行返回,就是长度了。

下一篇: 838. 堆排序