字符串函数

strlen的使用和模拟实现

使用部分:

strlen的原型是size_t strlen(const char* str)

字符串以'\0'作为结束标志,计算'\0'前面出现的字符个数。strlen是size_t类型(无符号整形)

3 - 6 = -3,但因为是无符号整形,没有负数,会被理解成很大的正数。

模拟部分:

strlen的模拟一般用两种方法,一种是设置一个计时器,另一种用指针-指针返回指针之间的元素个数来实现

第三种用递归(不创建临时变量)

第一种

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

第二种

size_t my_strlen(const char* str)
{
    assert(str);
    char* st = str;
    while (*str)
    {
        str++;
    }
    return str - st;
}

第三种用递归

size_t my_strlen(const char* str)
{
    if (*str == '\0')
        return 0;
    else
        return 1 + my_strlen(str+1);//这里str+1不能是str++
}

strcpy的使用和模拟实现

使用部分:

原型:char *strcpy(char *dest, const char *src);

strcpy() 函数接受两个参数:

  • dest:要复制到的目标字符串的指针。
  • src:要复制的原字符串的指针。

另外,strcpy在复制字符串时会把原字符串的'\0'复制过去。

使用strcpy时,原字符串必须包含'\0'

目标空间必须可修改,也就是需要拷贝信息的字符串必须是可修改的

模拟部分:

void my_strcpy(char* dest, char* src)
{
    /*assert(dest != NULL);
    assert(src != NULL);*/
    assert(dest && src);
    char* s = dest;
    while (*dest++ = *src++) 
    {
    }
    dest = s;
}

用assert断言,传递的dest与src不能是为空,提高代码的安全性

*dest++ = *src++,虽然++的优先级比*的优先级高,但后置++,先使地址解引用,得到dest和src的内容,后*dest = *src,最后才是地址dest++,src++。

NULL本质上是0,一般用于指针的初始化

\0是\ddd形式的转义字符,本质上也是0,一般字符串的末尾会有'\0',是字符串的结束标志

null和NUL也是\0

'0' 字符0,本质是48,ASCII值为48

strcat的使用和模拟实现

strcat() 是一个 C 语言中的字符串库函数,用于将一个字符串(源字符串)追加到另一个字符串(目标字符串)的末尾

函数原型:char *strcat(char *dest, const char *src);

这个函数返回的是目标空间的地址。

使用要求:1.源字符串必须包含'\0',2.目标字符串也要包含'\0',3.目标空间必须足够大(可容纳源字符串的内容),4.目标空间必须可修改

1.使用部分:

注意,不能自己跟自己添加,会把字符串尾部的'\0'消掉。

2.模拟部分

char* my_strcar(char* dest, const char* src)
{
    char* ret = dest;
    while (*dest)
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

strcmp的使用和模拟实现

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

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

trcmp() 函数会按照字典顺序(ASCII 值)比较 str1str2 指向的字符串。如果两个字符串相同,返回值为 0;如果 str1 小于 str2,返回值小于 0;如果 str1 大于 str2,返回值大于 0。

(从首位开始,比较字符的大小)

使用部分:

模拟部分:

int my_strcmp(const char* s1,const char* s2)
{
    //assert(dest && src);
    while (*s1 == *s2)//不能用*s1++ == *s2++
    {
        if (*s1 == '\0')
            return 0;
        s1++;
        s2++;
    }
    if (*s1 > *s2)
        return 1;
    else
        return -1;
}

str与strn的区别

strcpy  strcat  strcmp 的长度不受限制的字符串函数----不安全

与scanf的报错一致,不安全

strncpy  strncat  strncmp 的长度受限制的字符串函数

相对安全

strncpy的使用

strncpy() 是 C 语言中的一个字符串复制函数,用于将一个字符串的一部分复制到另一个字符串中。函数的声明如下:

char *strncpy(char *dest, const char *src, size_t n);

strncpy() 函数会将 src 指向的字符串的最多前 n 个字符复制到 dest 指向的字符串中。如果 src 的长度小于 n,则剩余的部分会用空字符 '\0' 来填充。函数返回指向 dest 的指针。

strncat的使用

strncat() 是 C 语言中的一个字符串追加函数,用于将一个字符串的一部分追加到另一个字符串的末尾。函数的声明如下:

char *strncat(char *dest, const char *src, size_t n);

strncat() 函数会将 src 指向的字符串的最多前 n 个字符追加到 dest 指向的字符串的末尾。函数返回指向 dest 的指针。

追加到末尾时增添一个'\0'

可以自己给自己追加

最多追加源字符串和'\0',再多就不会追加了,与strncpy不一样

strcmp的使用

strncmp() 是 C 语言中的一个字符串比较函数,用于比较两个字符串的前 n 个字符的大小。函数的声明如下:

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

strncmp() 函数会按照字典顺序(ASCII 值)比较 str1str2 指向的字符串的前 n 个字符。如果两个字符串的前 n 个字符相同,返回值为 0;如果 str1 小于 str2,返回值小于 0;如果 str1 大于 str2,返回值大于 0。

strstr的使用与模拟实现

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

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

strstr() 函数会在 haystack 指向的字符串中查找第一次出现 needle 指向的子字符串的位置,并返回该位置的指针。如果找到了子字符串,则返回指向子字符串在原始字符串中的位置;如果未找到,则返回 NULL。

使用部分

模拟部分

查找时会遇到一下三种类似情况。

char* my_strstr(const char* str1, const char* str2)
{
    
    const char* cur = str1;
    const char* s1 = NULL;
    const char* s2 = NULL;
    assert(str1 && str2);
    if (!*str2)
        return (char*) str1;
    while (cur)
    {
        s1 = cur;
        s2 = str2;
        while (*s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
            return(char*) cur;
        cur++;
    }
    return NULL;
}

相关推荐

  1. 字符函数字符串函数

    2024-03-10 09:38:05       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 09:38:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 09:38:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 09:38:05       82 阅读
  4. Python语言-面向对象

    2024-03-10 09:38:05       91 阅读

热门阅读

  1. 设计模式之责任链及策略模式

    2024-03-10 09:38:05       42 阅读
  2. 2024.03.04——2024.03.10 力扣练习总结及专项巩固

    2024-03-10 09:38:05       38 阅读
  3. 自动备份数据到异地服务器(另一台电脑)

    2024-03-10 09:38:05       41 阅读
  4. linux系统elk组件logstash部署

    2024-03-10 09:38:05       36 阅读
  5. 旅游专业VR虚拟仿真情景教学实训

    2024-03-10 09:38:05       41 阅读
  6. 排序之冒泡排序

    2024-03-10 09:38:05       44 阅读