12字符函数

news2025/2/28 5:41:36

一、函数strchr与strrchr

  • 注意:
  1. 这两个函数的功能,都是在指定的字符串 s 中,试图找到字符 c。
  2. strchr() 从左往右找,strrchr() 从右往左找。
  3. 字符串结束标记 ‘\0’ 被认为是字符串的一部分。
  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>

// 自己写的库
/**
  * @brief  查找字符c在字符串s的位置
  * @note   从左到右来查找这个字符的位置  
  * @param  s:指定要查找的字符串
            c:待查字符
  * @retval 成功:返回指向找到的字符的指针
            失败:返回NULL
  */
char* MyLib_StrLChr(const char *s, int c)
{
    // 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了
    if ( s == NULL)
        return NULL;    // 失败,返回NULL


    // 2、移动指针s获取字符串的字符并与字符c判断是否一致,一致就退出
    while ( (*s != '\0') && (*s != c))
    {
        s++;        // 指针s会一直往字符串的末尾移动(一直到'\0'为止)
    }

    // 3、判断是结束符'\0',还是找到的字符c
    if ( *s == '\0')
        return NULL;
    else
        return (char *)s;
} 

/**
  * @brief  查找字符c在字符串s的位置
  * @note   从右到左来查找这个字符的位置  
  * @param  s:指定要查找的字符串
            c:待查字符
  * @retval 成功:返回指向找到的字符的指针
            失败:返回NULL
  */
char* MyLib_StrRChr(const char *s, int c)
{
    // 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了
    if ( s == NULL)
        return NULL;        // 失败,返回NULL

    const char *tmp_p = s;  // 记住最初的这个字符串的地址(也就是字符串首字符的地址)

    // 2、先将指针s移动到字符串的末尾
    while ( *s != '\0')
    {
        s++;
    }

    // 3、从右往左判断c是否存在
    while ( (*s != c) &&  ( s != tmp_p))
    {
        s--;        
    }

    // 3、判断是结束符'\0',还是找到的字符c
    if ( s == tmp_p)
        return NULL;
    else
        return (char *)s;
}
// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    // 1、strchr函数(从左往右找)
    const char *s1 = "shijienameda";
    int c1         = 'i';
    char * p1      = strchr(s1, c1);
    printf("p1 == %s\n", p1);

    // 2、strrchr函数(从右往左找)
    const char *s2 = "shijienameda";
    int c2         = 'i';
    char * p2      = strrchr(s2, c2);
    printf("p2 == %s\n", p2);

    // (2)、自己写的库
    // 1、MyLib_StrChr函数(从左往右找)
    const char *s3 = "shijienameda";
    int c3         = 'i';
    char * p3      = MyLib_StrLChr(s3, c3);
    printf("p3 == %s\n", p3);

    // 2、MyLib_StrRChr函数(从右往左找)
    const char *s4 = "shijienameda";
    int c4         = 'i';
    char * p4      = MyLib_StrRChr(s4, c4);
    printf("p4 == %s\n", p4);

    return 0;
}

二、函数strstr

  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>

// 自己写的库
/**
  * @brief  在指定的一个字符串中,找到一个子串
  * @note   None    
  * @param  s:指定要查找的字符串
            c:待查字符
  * @retval 成功:返回指向找到的字符的指针
            失败:返回NULL
  */
char* MyLib_StrStr(const char *haystack, const char *needle)
{
    // 初始化
    const char *tmp_p1 = haystack;
    const char *tmp_p2 = needle;

    const char *p1     = haystack;
    const char *p2     = needle;

    // 1、判断输入的两个字符串是否为NULL,为NULL就直接退出
    if ( (haystack == NULL) || (needle == NULL))
    {
        return NULL;
    }

    // 2、遍历haystack字符串,找到所有可能
    while ( *tmp_p1 != '\0')
    {
        // 在进去比较循环之前,将p1和p2的最初的的位置(循环之前)进行保留
        p1 = tmp_p1;
        p2 = tmp_p2;

        // 进入循环依次比较两个字符串的字符是否一致,防止比较的字符串在末尾
        while ( (*p1 == *p2) && (*p1 != '\0') && (*p2 != '\0'))
        {
            p1++;
            p2++;
        }

        if ( *p2 == '\0')           // 判断p2是否指向'\0',是的话,就意味着找到了s1中的子串s2
        {
            return (char *)tmp_p1;  // 返回s1中的子串的地址
        }

        tmp_p1++;
    }

    // 3、没有找到该子串,就返回NULL
    return NULL;
}

// 主函数
int main(int argc, char const *argv[])
{
 
    // (1)、官方写的库 
    const char *s1 = "chuangqianmingyueguang,yishidishangshuang";
    const char *s2 = "yishi";

    char *p1 = strstr(s1, s2);
    printf("p1 == %s\n", p1);
    
    // (2)、自己写的库 
    const char *s3 = "chuangqianmingyueguang,yishidishangshuang";
    const char *s4 = "yishi";

    char *p2 = MyLib_StrStr(s3, s4);
    printf("p2 == %s\n", p2);
    
    return 0;
}

三、函数strlen

  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>

// 给类型取个别名
typedef  unsigned long  my_size_t;

// 自己写的库
/**
  * @brief  求一个指定字符串的长度
  * @note   None    
  * @param  s:需要求长度的字符串
  * @retval 成功:返回字符串的长度,不包含字符串结束标记'\0'
            失败:返回0
  */
my_size_t MyLib_StrLen(const char *s)
{
    // 1、如果传进来的字符串是空的,那就没有必要继续下面的判断了
    if ( s == NULL)
        return 0;    // 失败,返回0

    // 2、计算从左到右,一直到'\0',有多少个字符
    my_size_t cnt = 0;
    while ( *s != '\0')
    {
        cnt++;
        s++;
    }
    
    // 3、返回计算的字符串的长度
    return cnt;
}

// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    const char buf1[256] = "wuaiyousan,riyueyuqing,riweizhao,yueweimu,qingweizhaozhaomumu";
    size_t len1 = strlen(buf1);
    printf("len1 == %lu\n", len1);


    // (2)、自己写的库
    const char buf2[256] = "wuaiyousan,riyueyuqing,riweizhao,yueweimu,qingweizhaozhaomumu";
    size_t len2 = MyLib_StrLen(buf2);
    printf("len2 == %lu\n", len2);
    

    return 0;
}

四、函数strcpy与strncpy

  • 注意:
  1. 复制src字符串的时候,也会将'\0',一并复制到dest中
  2. 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中。
  3. strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
  4. strncpy() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 中。
  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>

// 自己写的库
/**
  * @brief  复制字符串
  * @note   None    
  * @param  dest:指向目标内存,存储复制的字符串
            src: 指向待复制的字符串
  * @retval 成功:返回一个指针,指向复制后的字符串,等价于dest
            失败:返回NULL
  */
char* MyLib_StrCpy(char *dest, const char *src)
{
    // 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了
    if ( (dest == NULL) || (src == NULL))
    {
        return NULL;
    }

    char *tmp_p = dest;     // 记录dest指针最初指向的地方
    // 2、根据str字符串的结束符'\0',来进行移位赋值给dest内存
    while ( *src != '\0' )
    {
        *tmp_p = *src;   // 赋值操作,将src内存里面的内容复制到dest内存中
        tmp_p++;
        src++;
    }

    // 3、返回指向dest内存的地址
    return dest; 
}


/**
  * @brief  复制字符串
  * @note   None    
  * @param  dest:指向目标内存,存储复制的字符串
            src: 指向待复制的字符串
            n:    规定最多将src中的n个字符复制到dest内存中
  * @retval 成功:返回一个指针,指向复制后的字符串,等价于dest
            失败:返回NULL
  */
char* MyLib_StrNCpy(char *dest, const char *src, unsigned long n)
{
    // 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了
    if ( (dest == NULL) || (src == NULL))
    {
        return NULL;
    }

    char *tmp_p = dest;     // 记录dest指针最初指向的地方
    // 2、根据n来限定复制src字符串内容给dest内存的范围
    int len  = strlen(src);
    if (n >= len)
    {
        n = len;
    }
    
    while ( n -- )
    {
        *tmp_p = *src;   // 赋值操作,将src内存里面的内容复制到dest内存中
        tmp_p++;
        src++;
    }

    // 3、返回指向dest内存的地址
    return dest; 
}

// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    // 1、strcpy函数
    char      dest_buf1[256] = {0};               // 目标内存1
    const char str_buf1[128] = "shijienameda";    // 要复制的字符串1

    char *p1 = strcpy(dest_buf1, str_buf1);       // 有点危险,没有边界
    printf("dest_buf1 == %s\n", dest_buf1);
    printf("p1        == %s\n", p1);
    
    // 2、strncpy函数
    char      dest_buf2[256] = {0};               // 目标内存2
    const char str_buf2[128] = "shijienameda";    // 要复制的字符串2

    char *p2 = strncpy(dest_buf2, str_buf2, 5);   // 比较安全,可以控制复制的范围
    printf("dest_buf2 == %s\n", dest_buf2);
    printf("p2        == %s\n", p2);

    // (2)、自己写的库
    // 1、MyLib_StrCpy函数
    char      dest_buf3[256] = {0};               // 目标内存1
    const char str_buf3[128] = "shijienameda";    // 要复制的字符串1

    char *p3 = MyLib_StrCpy(dest_buf3, str_buf3); // 有点危险,没有边界
    printf("dest_buf3 == %s\n", dest_buf3);
    printf("p3        == %s\n", p3);
    
    // 2、MyLib_StrNCpy函数
    char      dest_buf4[256] = {0};               // 目标内存2
    const char str_buf4[128] = "shijienameda";    // 要复制的字符串2

    char *p4 = MyLib_StrNCpy(dest_buf4, str_buf4, 5);   // 比较安全,可以控制复制的范围
    printf("dest_buf4 == %s\n", dest_buf4);
    printf("p4        == %s\n", p4);
    return 0;
}

五、函数strcmp与strncmp

  • 注意:
    • 比较字符串大小,实际上比较的是字符的 ASCII码值的大小。
    • 从左到右逐个比较两个字符串的每一个字符,当能“决出胜负”时立刻停止比较。
  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>
// 

// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    // 1、strcmp函数
    const char password1[128] = "fhq9127";
    char input_pw1[128]       = "fhq9127";

    if ( strcmp(password1, input_pw1) == 0)   // 两个字符串的字符都相等,返回0
        printf("(strcmp)密码输入正确!\n");
    else
        printf("(strcmp)密码输入错误!\n");

    // 2、strncmp函数
    const char password2[128] = "fhq9127";
    char input_pw2[128]       = "fhq9128";

    if ( strncmp(password2, input_pw2, 3) == 0)   // 两个字符串的字符都相等,返回0
        printf("(strcmp)密码输入正确!\n");
    else
        printf("(strcmp)密码输入错误!\n");

    

    
    return 0;
}

六、函数strcat与strncat

  • 注意:
  1. 这两个函数的功能,都是将 src 中的字符串,复制拼接到 dest 的末尾。
  2. strcat() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。
  3. strncat() 有边界控制,最多复制 n+1 个字符(其中最后一个是 ‘\0’ )到 dest 的末尾。
  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>
// 自己写的库


/**
  * @brief  将两个字符串拼接起来
  * @note   None    
  * @param  dest:指向目标内存,最终存储拼接之后的字符串
            src: 指向需要拼接的字符串,最终将src拼接到dest的后面
  * @retval 成功:返回一个指针,指向拼接后的字符串,等价于dest
            失败:返回NULL
  */
char* MyLib_StrCat(char *dest, const char *src)
{
    char *p1       = dest;
    const char *p2 = src;

    // 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了
    if ( (dest == NULL) || (src == NULL))
    {
        return NULL;
    }

    // 2、将指针p1移动到字符串末尾(这个'\0'符号的位置)
    while ( *p1 != '\0')
    {
        p1++;
    }

    // 3、将src字符串的字符,复制到dest中
    while ( *p2 != '\0')
    {
        *p1 = *p2;
        p1++;
        p2++;
    }

    // 4、补回一个'\0'字符给dest字符串
    *p1 = '\0';

    // 5、返回dest最初指向的内存位置
    return dest;
}

/**
  * @brief  将两个字符串拼接起来
  * @note   None    
  * @param  dest:指向目标内存,最终存储拼接之后的字符串
            src: 指向需要拼接的字符串,最终将src拼接到dest的后面
            n:   规定最多将src中的n个字节拼接到dest的后面
  * @retval 成功:返回一个指针,指向拼接后的字符串,等价于dest
            失败:返回NULL
  */
char* MyLib_StrNCat(char *dest, const char *src, unsigned long int n)
{
    char *p1       = dest;
    const char *p2 = src;

    // 1、如果传进来的指针是有误的(比如:NULL),没有必要继续下面的内容了
    if ( (dest == NULL) || (src == NULL) || (n<=0)) 
    {
        return NULL;
    }

    // 2、将指针p1移动到字符串末尾(这个'\0'符号的位置)
    while ( *p1 != '\0')
    {
        p1++;
    }

    // 3、将src字符串的字符,复制到dest中
    while ( (*p2 != '\0') && (n--))
    {
        *p1 = *p2;
        p1++;
        p2++;
    }

    // 4、补回一个'\0'字符给dest字符串
    *p1 = '\0';

    // 5、返回dest最初指向的内存位置
    return dest;
    
}

// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    // 1、strcat函数
    char dest_buf[256]       = "qingge";        // 目标字符串
    const char src_buf1[128] = ",nihaoshuai";   // 要拼接的字符串1
    const char src_buf2[128] = ",zhendejiade";  // 要拼接的字符串2

    char *p1 = strcat(dest_buf, src_buf1);
    printf("p1 == %s\n", p1);
    
    // 2、strncat函数
    char *p2 = strncat(dest_buf, src_buf2, 7);
    printf("p2 == %s\n", p2);
    

    // (2)、自己写的库
    // 1、MyLib_StrCat函数
    char dest_buf1[256]       = "qingge";       // 目标字符串
    const char src_buf3[128] = ",nihaoshuai";   // 要拼接的字符串3
    const char src_buf4[128] = ",zhendejiade";  // 要拼接的字符串4

    char *p3 = strcat(dest_buf1, src_buf3);
    printf("p3 == %s\n", p3);
    
    // 2、MyLib_StrNCat函数
    char *p4 = MyLib_StrNCat(dest_buf1, src_buf4, 7);
    printf("p4 == %s\n", p4);

    return 0;
}

七、函数strtok

  • 注意:
  1. 该函数会将改变原始字符串 str,使其所包含的所有分隔符变成结束标记 ‘\0’ 。
  2. 由于该函数需要更改字符串 str,因此 str 指向的内存必须是可写的。
  3. 首次调用时 str 指向原始字符串,此后每次调用 str 用 NULL 代替。
  • 图解:

  • 示例代码:
#include <stdio.h>
#include <string.h>
/**
  * @brief  将某个字符串,按照指定的分隔符拆解为子串
  * @note   None    
  * @param  str: 指定要拆解的字符串
            delim: 分隔符,此处可以指定多个分隔符,形成一个分隔符串
  * @retval 成功:指向子串的指针
            失败:返回NULL,代表拆解完毕    
  */
char* MyLib_StrTok(char *str, const char *delim)
{
    static  char  *last_str_p = NULL;        // 记住上一次调用函数时使用 last_str_p的地方;
            char  *p1         = str;
            char  *p2         = NULL;

    // 1、将上一次返回的指向,赋值给现在的str
    if (p1 == NULL)
    {
        p1 = last_str_p;
    }

    // 2、判断输入的两个字符串是否为NULL,是的话就直接退出
    if ( (p1 == NULL) || (delim == NULL))
    {
        return NULL;
    }

    // 3、退出函数的准备
    // 判断p1是否指向了字符串的末尾,是的话退出此函数
    if (*p1 == '\0')
    {
        return NULL;
    }

    // 4、将str的值给p2,记录p1现在的位置
    p2 = p1;

    // 5、移动p1的位置,直到字符串结束,或者p1指针遇到分隔符delim
    while ( (*p1 != '\0') && (*p1 != *delim))
    {
        p1++;
    }

    // 6、将分隔符设置为'\0',方便字符串获取
    if (*p1 != '\0')
    {
        *p1 = '\0';
        last_str_p = p1+1;  // 将位置移动下一次要分隔的字符串的首字符上
    }
    else
    {
        last_str_p = p1;    // 字符串分割到末尾了,让其指向字符串末尾的'\0',方便下一次进行判断
    }
    
    return p2;
    
}


// 主函数
int main(int argc, char const *argv[])
{
    // (1)、官方写的库
    char dest_buf[256] = "www.yueqian.com.cn";  // 目标字符串,必须是可写内存
    
    char *p1 = strtok(dest_buf, ".");           // 这里的分隔符(准确来说应该是分隔符串),是字符串,但是一般情况下以字符形式来切割
    while ( p1 != NULL)
    {
        printf("p1 == %s\n", p1);               // 不是说一定要用printf函数来表示,而是代表现在这个p1代表的子串,现在正在被我所用
        p1 = strtok(NULL, ".");
    }


    // (2)、自己写的库
    char dest_buf1[256] = "www.yueqian.com.cn";  // 目标字符串,必须是可写内存

    char *p2 = MyLib_StrTok(dest_buf1, ".");           // 这里的分隔符(准确来说应该是分隔符串),是字符串,但是一般情况下以字符形式来切割
    while ( p2 != NULL)
    {
        printf("p2 == %s\n", p2);                // 不是说一定要用printf函数来表示,而是代表现在这个p1代表的子串,现在正在被我所用
        p2 = MyLib_StrTok(NULL, ".");
    }
    
        
    return 0;
}

至此,希望看完这篇文章的你有所收获,我是Bardb,译音八分贝,道友,下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发

Github Copilot是Github和OpenAI推出的AI编程辅助工具&#xff0c;之前版本的Github Copilot只有简单的代码自动补全&#xff0c;根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级&#xff0c;加入了Agent模式&#xff0c;可以实现自然语言对话讨论和最重要的&a…

矩阵的奇异值(SVD)分解和线性变换

矩阵的奇异值&#xff08;SVD&#xff09;分解和线性变换 SVD定义 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称 SVD&#xff09;是一种重要的线性代数工具&#xff0c;能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…

数据库的sql语句

本篇文章主要用来收集项目开发中&#xff0c;遇到的各种sql语句的编写。 1、根据user表的role_id字段&#xff0c;查询role表。 sql语句&#xff1a;使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…

Bugku CTF Crypto(二)

目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官&#xff08;宫&#xff09; 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析&#xff1a;题目提示这不是md5&#xff0c;字符中出现了d&#xff0c;猜测16进制 使用…

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…

Rt-thread源码剖析(1)——内核对象

前言 该系列基于rtthread-nano的内核源码&#xff0c;来研究RTOS的底层逻辑&#xff0c;本文介绍RTT的内核对象&#xff0c;对于其他RTOS来说也可供参考&#xff0c;万变不离其宗&#xff0c;大家都是互相借鉴&#xff0c;实现不会差太多。 内核对象容器 首先要明确的一点是什…

十一、大数据治理平台总体功能架构

大数据治理平台的功能架构图中心主题&#xff1a;数据治理 核心重点是建立健全大数据资产管理框架&#xff0c;确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台&#xff08;左侧&#xff09; 此部分主要关注数据资产本身…

STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)

定时器有四个通道&#xff0c;这些通道既可以用来作为输入&#xff0c;又可以作为输出。做输入的时候&#xff0c;可以使用定时器对外部输入的信号的时间参数进行测量&#xff1b;做输出的时候&#xff0c;可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单&#xff0c;这里说一下遇到的问题 一&#xff1a;Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …

修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板

前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…

四、Redis主从复制与读写分离

一、环境搭建 准备环境 IP角色192.168.10.101Master192.168.10.102Slave192.168.10.103Slave 创建配置/数据/日志目录 # 创建配置目录 mkdir -p /usr/local/redis/conf # 创建数据目录 mkdir -p /usr/local/redis/data # 创建日志目录 mkdir -p /usr/local/redis/log修改配置…

数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全

信息化高速发展&#xff0c;数据已成为企业的核心资产&#xff0c;驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入&#xff0c;常态化的数据流通不仅促进了信息的快速传递与共享&#xff0c;还能帮助企业快速响应市场变化&#xff0c;把握商业机遇&#xff0c;实…

Apache DolphinScheduler系列1-单节点部署及测试报告

文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…

Java+SpringBoot+Vue+数据可视化的音乐推荐与可视化平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在互联网技术以日新月异之势迅猛发展的浪潮下&#xff0c;5G 通信技术的普及、云计算能力…

LVS+Keepalived 高可用集群搭建

一、高可用集群&#xff1a; 1.什么是高可用集群&#xff1a; 高可用集群&#xff08;High Availability Cluster&#xff09;是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务&#xff0c;把因软件、硬件、人为造成的故障对业务的影响…

PydanticToolsParser 工具(tool call)把 LLM 生成的文本转成结构化的数据(Pydantic 模型)过程中遇到的坑

PydanticToolsParser 的作用 PydanticToolsParser 是一个工具&#xff0c;主要作用是 把 LLM 生成的文本转成结构化的数据&#xff08;Pydantic 模型&#xff09;&#xff0c;让代码更容易使用这些数据进行自动化处理。 换句话说&#xff0c;AI 生成的文本通常是自然语言&…