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

简介:

strlen的使用与模拟实现

#include<string.h>
size_t strlen ( const char * str );

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


模拟实现

方法一

*计数器方式


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


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

方法二

*指针-指针方式


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

strcpy函数的模拟与实现

char* strcpy(char * dest, const char * src );

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


示例代码如下


#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’ 拷贝到目标空间。

模拟实现


int my_strcpy(char*dest,char*src)
{
    char* ret = dest;
    assert(dest && src);
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}


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


strcat函数的使用与模拟实现

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


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


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

示例代码如下:


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

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

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

    return 0;
}


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


#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 将一个字符串追加到自身。

模拟实现


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语言中的一个字符串处理函数,用于比较两个字符串的大小。该函数的声明如下:


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

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


函数返回值为:


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

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

*如果字符串str1等于str2,则返回0。


示例代码如下:




#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;
}

模拟实现

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 语言中的一个字符串处理函数,用于在一个字符串中查找另一个字符串第一次出现的位置。其声明如下:

char *strstr(const char *haystack, const char *needle);



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


示例代码如下:


#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.” 中的位置。如果找到子字符串,则会输出子字符串的位置,如果找不到,则会输出未找到的信息。

模拟实现

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; 
}

感谢阅读




相关文章
|
5月前
(二)字符函数和字符串函数详细讲解和模拟实现(优化)
(二)字符函数和字符串函数详细讲解和模拟实现(优化)
|
5月前
(一)字符函数和字符串函数详细讲解和模拟实现(优化)
(一)字符函数和字符串函数详细讲解和模拟实现(优化)
|
5月前
|
安全
16.字符串函数的使用和模拟实现(全)
16.字符串函数的使用和模拟实现(全)
|
6月前
字符串函数的模拟实现
字符串函数的模拟实现
37 1
|
6月前
|
C语言
字符函数和字符串函数解析及模拟实现
字符函数和字符串函数解析及模拟实现
77 0
|
C语言 C++
C/C++字符函数和字符串函数详解————内存函数详解与模拟
C/C++字符函数和字符串函数详解————内存函数详解与模拟
50 1
|
11月前
|
程序员
字符串函数的使用及其模拟实现
字符串函数的使用及其模拟实现
49 0
|
11月前
|
编译器 C语言
字符串函数的使用及模拟实现
字符串函数的使用及模拟实现
36 0
|
C语言
深入探索字符串函数与模拟实现
深入探索字符串函数与模拟实现
98 1
深入探索字符串函数与模拟实现
字符函数和字符串函数的使用及模拟实现(上)(2)
字符函数和字符串函数的使用及模拟实现
87 0