前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符串函数的介绍与模拟实现(一)

字符串函数的介绍与模拟实现(一)

作者头像
用户11029103
发布2024-03-19 15:27:37
720
发布2024-03-19 15:27:37
举报
文章被收录于专栏:技术学习技术学习

strlen的使用与模拟实现

代码语言:javascript
复制
#include<string.h>
size_t strlen ( const char * str );

strlen函数是求字符串长度的函数,其使用需要包含头文件,其返回值是**‘/0’**前所有的字符数量,函数的返回值为无符号(size_t)类型整数

模拟实现 方法一 *计数器方式

代码语言:javascript
复制
int my_strlen(const char * str)
{
 int count = 0;
 assert(str);
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}

assert断言其不为空指针,指针向右移动,直到遇见**‘/0’**为止。 方法二 *指针-指针方式

代码语言:javascript
复制
int my_strlen(char *s)
{
 assert(str);
 char *p = s;
 while(*p != ‘\0’ )
 p++;
 return p-s;
}

strcpy函数的模拟与实现

代码语言:javascript
复制
char* strcpy(char * dest, const char * src );

strcpy函数是C语言中的一个字符串处理函数,用于将一个字符串复制到另一个字符串中,dest是目标字符串,src是源字符串。strcpy函数将源字符串src复制到目标字符串dest中,并返回目标字符串的指针。需要注意的是,目标字符串dest必须有足够的空间来存储源字符串src的内容,否则可能会出现缓冲区溢出的问题

示例代码如下

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello, world!";
    char dest[20];

    strcpy(dest, src);
    printf("%s", dest);

    return 0;
}

需要注意,strcpy函数会将源字符串中的 ‘\0’ 拷贝到目标空间。 模拟实现

代码语言:javascript
复制
int my_strcpy(char*dest,char*src)
{
    char* ret = dest;
    assert(dest && src);
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

这里ret记录目标字符串起始地址,在修改后进行返回,while中两个变量先赋值再加加。

strcat函数的使用与模拟实现

strcat函数,是C语言中的一个字符串处理函数,用于将一个字符串追加到另一个字符串的末尾。其声明如下:

代码语言:javascript
复制
char *strcat(char *dest, const char *src);

其中,dest是目标字符串,src是要追加到目标字符串末尾的源字符串。strcat函数将源字符串src追加到目标字符串dest的末尾,并返回目标字符串的指针。需要注意的是,目标字符串dest必须有足够的空间来容纳源字符串src的内容,否则可能会出现缓冲区溢出的问题。 示例代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello, ";
    char src[] = "world!";

    strcat(dest, src);
    printf("%s\n", dest);

    return 0;
}

在这里我们思考一下,能否实现一下代码?

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    char dest[20] = "Hello";
    strcat(dest, dest);
    printf("%s\n", dest);

    return 0;
}

当这个例子中使用 strcat(dest, dest); 时,意味着将 dest 中的内容追加到 dest 本身的末尾。这是一个问题,因为 strcat 函数期望第一个参数指向一个以 '\0' 结尾的字符串,而且第二个参数也必须指向一个以 '\0' 结尾的字符串。

在这个例子中,dest 只包含一个字符串 “Hello” ,因此没有 '\0' 空字符来标记字符串的结束。在C语言中,字符串必须以 '\0' 结尾,这是C语言的约定。因此,由于缺少 '\0' 结尾符, strcat 函数无法判断字符串的结束位置,这可能导致未定义的行为。

另外,如果 dest 的长度不够长,strcat 函数仍然可能会导致缓冲区溢出,这也是应该避免的情况。

因此,应该遵循C语言的约定,确保字符串以 '\0' 结尾,并且避免使用 strcat 将一个字符串追加到自身。 模拟实现

代码语言:javascript
复制
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	while (*dest)
	{
		dest++;//找到\0
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

strcmp函数的使用与模拟实现

strcmp函数是C语言中的一个字符串处理函数,用于比较两个字符串的大小。该函数的声明如下:

代码语言:javascript
复制
int strcmp(const char *str1, const char *str2);

其中,str1和str2是要进行比较的两个字符串。strcmp函数会按照字典顺序逐个比较两个字符串中对应位置的字符,直到遇到不同的字符或者其中一个字符串结束为止。比较规则是按照ASCII码表的顺序进行比较。

函数返回值为:

*如果字符串str1小于str2,则返回一个负数。 *如果字符串str1大于str2,则返回一个正数。 *如果字符串str1等于str2,则返回0。

示例代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";

    int result = strcmp(str1, str2);
    if (result < 0) {
        printf("str1 is less than str2\n");
    } else if (result > 0) {
        printf("str1 is greater than str2\n");
    } else {
        printf("str1 is equal to str2\n");
    }

    return 0;
}

a<b,所以result<0. 模拟实现

代码语言:javascript
复制
int my_strcmp (const char * str1, const char * str2)
{
 int ret = 0 ;
 assert(str1&&str2);
 while(*str1 == *str2)
 {
 if(*str1 == '\0')
 return 0;
 str1++;
 str2++;
 }
 return *str1-*str2;
}

strstr函数的使用与模拟实现

strstr 函数是 C 语言中的一个字符串处理函数,用于在一个字符串中查找另一个字符串第一次出现的位置。其声明如下:

代码语言:javascript
复制
char *strstr(const char *haystack, const char *needle);

其中,haystack 是要在其中查找的字符串,而 needle 则是要查找的子字符串。strstr 函数将会在 haystack 中找到第一次出现 needle 的位置,如果找到则返回该位置的指针,如果找不到则返回一个空指针。

示例代码如下:

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>

int main() {
    const char *haystack = "Hello, world! This is a test.";
    const char *needle = "world";

    char *result = strstr(haystack, needle);

    if (result) {
        printf("'%s' found at position %ld\n", needle, result - haystack);
    } else {
        printf("'%s' not found in '%s'\n", needle, haystack);
    }

    return 0;
}

在上述示例中,strstr 函数被使用来查找子字符串 “world” 在字符串 “Hello, world! This is a test.” 中的位置。如果找到子字符串,则会输出子字符串的位置,如果找不到,则会输出未找到的信息。 模拟实现

代码语言:javascript
复制
char* my_strstr(const char* str1, const char* str2) {
    if (*str2 == '\0') {
        return (char*)str1; 
    }

    while (*str1 != '\0') {
        const char* h = str1;
        const char* n = str2;
        while (*n != '\0' && *h == *n) {
            h++;
            n++;
        }
        if (*n == '\0') {
            return (char*)str1;
        }
        str1++;
    }

    return NULL; 
}

感谢阅读

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • strlen的使用与模拟实现
  • strcpy函数的模拟与实现
  • strcat函数的使用与模拟实现
  • strcmp函数的使用与模拟实现
  • strstr函数的使用与模拟实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档