当前位置: 首页 > news >正文

《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》

目录

七. strncpy函数的使用与模拟实现

7.1  strncpy函数理解

7.2  strncpy函数使用示例

7.3  strncpy函数模拟实现

八. strncat函数的使用与模拟实现

8.1 strncat函数理解

8.2 strncat函数使用示例

8.3 strncat函数模拟实现

九. strncmp函数的使用

9.1 strncmp函数理解

9.2 strncmp函数使用示例

十. strstr函数的使用与模拟实现

10.1 strstr函数理解

10.2 strstr函数使用示例

10.3 strstr函数模拟实现

十一. strtok函数的使用与模拟实现

11.1 strtok函数理解

11.2 strtok函数使用示例

11.3 strtok注意事项

十二. strerror函数的使用与模拟实现

12.1 strerror函数理解

12.2 strerror函数使用

12.3 perror函数


七. strncpy函数的使用与模拟实现

7.1  strncpy函数理解

strncpy 是 C 标准库中用于复制字符串的函数,定义在 <string.h> 头文件中。相比 strcpy,它提供了长度限制,可以防止缓冲区溢出。

函数原型

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

参数说明

  • dest: 目标字符数组,用于存储复制的内容

  • src: 源字符串,将被复制的字符串

  • n: 最多复制的字符数(包括 ‘\0’)

返回值

返回目标字符串 dest 的指针

功能特点

  1. 复制最多 n 个字符 从 src 到 dest

  2. 两种终止条件:

    • 遇到 src 的 ‘\0’ 终止符

    • 达到最大字符数 n

7.2  strncpy函数使用示例

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "hello,worldCCCCCCC";char* p = strncpy(arr1, arr2, 11);printf("%s\n", p);printf("%s\n", arr1);return 0;
}

7.3  strncpy函数模拟实现

#include<stdio.h>   // 标准输入输出库
#include<string.h>  // 字符串操作库
#include<assert.h>  // 断言库// 自定义的strncpy函数
// 参数:arr1 - 目标字符串,arr2 - 源字符串,num - 要拷贝的字符数
// 返回值:指向目标字符串的指针
char* my_strncpy(char* arr1, const char* arr2, size_t num)
{// 使用断言确保目标指针和源指针都不为NULLassert(arr1 && arr2);// 保存目标字符串的起始地址,用于返回char* p = arr1;int i = 0;// 循环拷贝字符,直到达到指定数量或遇到源字符串的结束符for (i = 0; i < num && arr2[i]; i++){arr1[i] = arr2[i];}// 如果拷贝的字符数少于指定数量,则在目标字符串后添加结束符if (i < num){arr1[i] = 0;}// 返回目标字符串的起始地址return p;
}int main()
{char arr1[20] = { 0 };        // 初始化目标字符串数组,全部置为0char arr2[] = "abcdefg";      // 源字符串char* ret = my_strncpy(arr1, arr2, 5);  // 调用自定义函数,拷贝前5个字符printf("%s", ret);            // 输出结果:abcdereturn 0;
}

八. strncat函数的使用与模拟实现

8.1strncat函数理解

strncat 是 C 标准库中的一个字符串拼接函数,用于将源字符串的前 n 个字符追加到目标字符串的末尾,并自动添加终止符 \0

函数原型

char *strncat(char *dest, const char *src, size_t n);
  • dest:目标字符串(必须足够大以容纳追加后的结果)。
  • src:源字符串(不会被修改)。
  • n:最多追加的字符数(如果 src 长度小于 n,则只追加 src 的全部内容)。
  • 返回值:返回 dest 的指针。

8.2 strncat函数使用示例

#include<stdio.h>
#include<string.h>
int main()
{char arr1[20] = "hello";char arr2[] = "world";char*p=strncat(arr1, arr2,5);printf("%s\n", p);printf("%s\n", arr1);return 0;
}

8.3 strncat函数模拟实现

#include<stdio.h>   // 标准输入输出库
#include<assert.h>  // 断言库// 自定义的 strncat 函数
// 参数:arr1 - 目标字符串,arr2 - 源字符串,num - 要追加的字符数
// 返回值:指向目标字符串的指针
char* mystrncat(char* arr1, const char* arr2, size_t num)
{assert(arr1 && arr2);  // 确保目标指针和源指针都不为 NULLchar* p = arr1;        // 保存目标字符串的起始地址,用于返回// 找到目标字符串的末尾(即 '\0' 的位置)while (*arr1){arr1++;}// 从源字符串复制最多 num 个字符到目标字符串的末尾int i = 0;for (i = 0; arr2[i] && i < num; i++){arr1[i] = arr2[i];}// 如果 num 小于 0,则在目标字符串后添加结束符(但 num 是 size_t,不可能小于 0)if (num < 0){arr1[i] = 0;}return p;  // 返回目标字符串的起始地址
}int main()
{char arr1[20] = "hello ";      // 目标字符串char arr2[] = "worldCCCCC";        // 源字符串char* ret = mystrncat(arr1, arr2, 5);  // 调用自定义函数,追加前 3 个字符printf("%s", ret);            // 输出结果:helloworreturn 0;
}

九. strncmp函数的使用

9.1 strncmp函数理解

strncmp 是 C 标准库中的一个字符串比较函数,用于比较两个字符串的前 n 个字符。它的主要作用是判断两个字符串是否相等,或者在字典序(ASCII 码顺序)上的大小关系。


函数原型

int strncmp(const char *str1, const char *str2, size_t n);
  • str1:第一个字符串(不会被修改)。
  • str2:第二个字符串(不会被修改)。
  • n:最多比较的字符数。
  • 返回值
    • < 0str1 的前 n 个字符在字典序上小于 str2
    • = 0str1 的前 n 个字符与 str2 完全相同。
    • > 0str1 的前 n 个字符在字典序上大于 str2

strncmp 的工作原理:

  1. 逐个字符比较
    • 从 str1 和 str2 的第一个字符开始比较,直到遇到不同的字符或比较完 n 个字符。
  2. 比较规则
    • 如果 str1 的字符 ASCII 码值 < str2 的字符,返回 负数
    • 如果 str1 的字符 ASCII 码值 > str2 的字符,返回 正数
    • 如果前 n 个字符完全相同,返回 0
  3. 提前终止条件
    • 遇到 \0(字符串结束符)时停止比较。
    • 比较完 n 个字符时停止。

9.2 strncmp函数使用示例

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abcggg";int ret = strncmp(arr1, arr2, 5);if (ret > 0)printf("abcdef>abcggg\n");else if (ret < 0)printf("abcdef<abcggg\n");elseprintf("=\n");return 0;
}

十. strstr函数的使用与模拟实现

10.1 strstr函数理解

strstr 是 C 标准库中的一个字符串查找函数,用于在一个字符串中查找另一个字符串的首次出现位置。

函数原型

char *strstr(const char *haystack, const char *needle);
    • 参数
      • haystack:被搜索的主字符串
      • needle:要查找的子字符串
    • 返回值
      • 如果找到,返回指向主字符串中子字符串首次出现位置的指针
      • 如果未找到,返回 NULL

    功能说明:

    strstr 函数会扫描 haystack 字符串,查找 needle 字符串的第一次出现。查找是区分大小写的。

    10.2 strstr函数使用示例

    #include<stdio.h>
    #include<string.h>
    int main()
    {char arr1[] = "I LOVE CHAIN";char arr2[] = "LOVE";char* p = strstr(arr1, arr2);if (p != NULL)printf("查找成功: %s\n", p);elseprintf("抱歉 查找失败\n");
    }

    10.3 strstr函数模拟实现

    #include<stdio.h>   // 标准输入输出库
    #include<string.h>  // 字符串操作库
    #include<assert.h>  // 断言库// 自定义的 strstr 函数
    // 参数:str1 - 被查找的字符串,str2 - 要查找的子串
    // 返回值:如果找到,返回子串在 str1 中的起始地址;否则返回 NULL
    char* my_strstr(const char* str1, const char* str2)
    {assert(str1 && str2);  // 确保 str1 和 str2 都不为 NULLchar* p = (char*)str1;  // 用于遍历 str1char* s1 = NULL;        // 用于临时记录 str1 的当前位置char* s2 = NULL;        // 用于遍历 str2// 如果要查找的子串是空字符串,直接返回 str1if (*str2 == '\0')return (char*)str1;// 遍历 str1while (*p){s1 = p;            // 记录当前查找的起始位置s2 = (char*)str2;  // 每次从 str2 的开头开始匹配// 逐个字符比较,直到字符不匹配或任一字符串结束while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}// 如果 str2 已经遍历完(即找到完整匹配),返回起始位置 pif (*s2 == '\0')return p;p++;  // 继续查找下一个位置}return NULL;  // 遍历完 str1 仍未找到,返回 NULL
    }int main()
    {char arr1[] = "I LOVE CHINA";  // 被查找的字符串char arr2[] = "LOVE";      // 要查找的子串char* ret = my_strstr(arr1, arr2);  // 调用自定义查找函数if (ret != NULL){printf("查找成功:%s", ret);  // }else{printf("查找失败");}return 0;
    }

    十一. strtok函数的使用与模拟实现

    11.1 strtok函数理解

    strtok 是 C 标准库中的一个字符串分割函数,用于将一个字符串按照指定的分隔符(delimiters)拆分成多个子字符串(tokens)。


    函数原型

    #include <string.h>  // 需要包含头文件char *strtok(char *str, const char *delimiters);
    
    • str:待分割的字符串(首次调用时传入,后续调用传 NULL)。

    • delimiters:分隔符集合(如 ", \t \n" 表示按空格、逗号、制表符、换行符分割)。

    • 返回值

      • 成功时返回下一个子字符串(token)的指针。

      • 如果没有更多子字符串,返回 NULL

    strtok 的工作原理

    1. 首次调用

      • 传入待分割的字符串 strstrtok 找到第一个分隔符,将其替换为 \0,并返回第一个子字符串的指针。

    2. 后续调用

      • 传入 NULLstrtok 会从上次结束的位置继续查找下一个分隔符,并返回下一个子字符串。

    3. 结束条件

      • 当所有子字符串都被提取后,返回 NULL

    为什么后续调用传入NULL?

    原因如下:

    1. strtok 的工作原理

    strtok 是一个状态ful(stateful)函数,它会记住上一次处理的位置。具体来说:

    • 首次调用时,strtok 接收一个字符串(如 str)和分隔符(如 delimiters),它会从该字符串的起始位置开始扫描,找到第一个不包含分隔符的子字符串(token),并返回它。

    • 后续调用时,strtok 需要继续从上次结束的位置开始扫描剩余的部分。为了告诉 strtok 继续处理同一个字符串,需要传入 NULL 作为第一个参数。如果传入一个新的字符串,strtok 会重置内部状态,开始处理新的字符串。

    2. 为什么传入 NULL

    • 内部静态指针:strtok 内部使用一个静态指针(或全局变量)来记录当前处理的位置。首次调用时,这个指针被初始化为传入字符串的地址;后续调用时,传入 NULL 表示“继续处理上次的字符串”。

    • 避免重置状态:如果后续调用传入一个新的字符串(非 NULL),strtok 会重置内部指针,导致之前的分割状态丢失。

    11.2 strtok函数使用示例

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>int main() {char str[] = "hello,world;this|is-a.test";const char* delimiters = ",;|-.";  // 分隔符可以是逗号、分号、竖线、横线、点// 首次调用,传入 strchar* token = strtok(str, delimiters);while (token != NULL) {printf("Token: %s\n", token);token = strtok(NULL, delimiters);  // 后续调用传 NULL}return 0;
    }
    

    11.3 strtok注意事项

    1. 修改原字符串

      • strtok 会直接修改传入的字符串,将分隔符替换为 \0。因此,不能对常量字符串(如 "hello,world")使用 strtok,否则会导致段错误(Segmentation Fault)。

      • ✅ 正确:char str[] = "hello,world";(可修改)

      • ❌ 错误:char *str = "hello,world";(字符串常量,不可修改)

    2. 连续分隔符

      • 如果字符串中有连续的分隔符(如 "a,,b"),strtok 会跳过它们,不会返回空字符串。

    3. 不能嵌套调用

      • 由于 strtok 使用静态存储,不能同时用于多个字符串的分割。例如:
        char str1[] = "a,b";
        char str2[] = "1;2";
        char *token1 = strtok(str1, ",");  // 第一次调用
        char *token2 = strtok(str2, ";");  // 会破坏 str1 的分割状态!

    十二. strerror函数的使用与模拟实现

    12.1 strerror函数理解

    strerror 是 C 标准库中的一个函数,用于将错误代码(errno)转换为可读的错误信息字符串。它定义在 <string.h> 头文件中,通常与 errno(定义在 <errno.h>)一起使用,以便在程序出错时提供更友好的错误提示。


    函数原型

    #include <string.h>
    char *strerror(int errnum);
    
    • 参数

      • errnum:错误代码(通常是 errno 的值)。

    • 返回值

      • 返回一个指向错误描述字符串的指针(静态存储区,不可修改)。

    strerror 的用途

    • 在不同的系统和C语言标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用⼀个全局的变量 errno 来记录程序的当前错误码,只不过程序启动的时候errno是 0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在 errno 中,而⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回

    12.2 strerror函数使用

    #include <errno.h>
    #include <string.h>
    #include <stdio.h>
    //打印0~10这些错误码对应的信息
    int main()
    {int i = 0;for (i = 0; i <= 10; i++) {printf("%d.%s\n",i, strerror(i));}return 0;
    }

    示例

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    int main()
    {//C语言可以打开文件//fopen//如果以读的形式打开文件,文件是必须要存在的,如果文件不存在,则打开文件失败//fopen函数就会将错误码放在errno//同时函数就会返回NULLFILE* pFile;pFile = fopen("5_20.text", "r");if (pFile == NULL)printf( %s\n", strerror(errno));return 0;
    }

    12.3 perror函数

    perror 是 C 标准库(<stdio.h>)中的一个函数,用于打印与 errno 相关的错误信息。它的原型如下:

    void perror(const char *s);
    

    功能

    • 根据全局变量 errno(通常由系统调用或库函数设置)打印对应的错误描述。
    • 如果 s 不是 NULL 或空字符串,perror 会先输出 s,后跟一个冒号 : 和空格,然后输出 errno 对应的错误信息。
    • 如果 s 是 NULL 或空字符串,则只输出 errno 的错误信息。

    使用示例

    int main() {FILE* fp = fopen("nonexistent_file.txt", "r");if (fp == NULL) {perror("Failed to open file");}return 0;
    }

    与 strerror(errno) 的区别

    • perror 直接打印错误信息到 stderr(标准错误输出)。
    • strerror(errno) 返回错误信息的字符串,可以自定义输出方式:
    fprintf(stderr, "Error: %s\n", strerror(errno));

    以上就是字符函数和字符串函数上篇的全部内容 希望能够为您提供帮助

    往期回顾

    《C 语言字符串操作从入门到实战(上篇):字符分类、转换及strlen/strcpy等函数详解》

    相关文章:

    《C 语言字符串操作从入门到实战(下篇):strncpy/strncat/strstr 等函数原理与实现》

    目录 七. strncpy函数的使用与模拟实现 7.1 strncpy函数理解 7.2 strncpy函数使用示例 7.3 strncpy函数模拟实现 八. strncat函数的使用与模拟实现 8.1 strncat函数理解 8.2 strncat函数使用示例 8.3 strncat函数模拟实现 九. strncmp函数的使用 9.1 strncmp函数理…...

    百度智能云千帆AppBuilder RAG流程技术文档

    一、概述 本文档旨在详细阐述百度智能云千帆AppBuilder的RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;流程&#xff0c;包括API对接、知识库维护以及文档资料管理等关键环节。通过本流程&#xff0c;开发者可以高效地构建基于大模型的…...

    程序编辑器快捷键总结

    程序编辑器快捷键总结 函数跳转 函数跳转 Creator : F2VSCode : F12visual Studio : F12...

    MySQL中实现大数据量的快速插入

    一、SQL语句优化​ 1. ​批量插入代替单条插入​ ​单条插入会频繁触发事务提交和日志写入&#xff0c;效率极低。​批量插入通过合并多条数据为一条SQL语句&#xff0c;减少网络传输和SQL解析开销。 -- 低效写法&#xff1a;逐条插入 INSERT INTO table (col1, col2) VALUE…...

    从零基础到最佳实践:Vue.js 系列(8/10):《性能优化与最佳实践》

    引言 Vue.js 是一个轻量、灵活且易于上手的现代前端框架&#xff0c;因其响应式数据绑定和组件化开发而广受欢迎。然而&#xff0c;随着项目规模的增长&#xff0c;性能问题逐渐显现&#xff0c;例如首屏加载缓慢、页面渲染卡顿、内存占用过高等。性能优化不仅能提升用户体验&…...

    欧拉降幂(JAVA)蓝桥杯乘积幂次

    这个题可以使用欧拉降幂&#xff0c;1000000007是质数&#xff0c;所以欧拉函数值为1000000006. import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System…...

    Mysql的MVCC机制

    MySQL的MVCC机制主要通过以下几个关键要素来工作&#xff1a; 数据版本与隐藏列 - MySQL InnoDB存储引擎会在每行数据中添加几个隐藏列&#xff0c;用于实现MVCC。其中包括 DB_TRX_ID 列&#xff0c;记录最后一次修改该行数据的事务ID&#xff1b; DB_ROLL_PTR 列&#xff…...

    spring中的BeanFactoryAware接口详解

    一、接口定义与核心作用 BeanFactoryAware 是 Spring 框架提供的一个回调接口&#xff0c;允许 Bean 在初始化阶段获取其所属的 BeanFactory 实例。该接口定义如下&#xff1a; public interface BeanFactoryAware {void setBeanFactory(BeanFactory beanFactory) throws Bea…...

    mysql 创建用户,创建数据库,授权

    创建一个远程用户 create user test% identified by test1111; 创建一个数据库并指定编码 create database testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 授权 grant all privileges on testdb.* to test%; 应用更改&#xff1a; FLUSH PRIVILEGES; 注意…...

    Android 网络全栈攻略(三)—— 从三方库原理来看 HTTP

    前面两篇文章我们介绍了 HTTP 协议的请求方法、请求码以及常用的请求头/响应头的知识。本篇会从 OkHttp 配置的角度来看这些框架是如何实现 HTTP 协议的&#xff0c;目的是加深对 HTTP 的理解&#xff0c;并学习协议是如何落地的。我们会选取 OkHttp 中与协议实现相关的源码作为…...

    BlazeMeter录制jmeter脚本

    文章目录 chrome安装blazeMeter插件开始录制 chrome安装blazeMeter插件 开始录制 1、点击重置按钮 2、输入名称 3、点击开始录制 4、打开浏览器操作 5、回到录制页面点击stop(注意&#xff0c;不要在第四步操作的那个窗口点停止) 6、点击save 7、保存jmeter脚本 8、将jmeter脚…...

    SQL的RAND用法和指定生成随机数的范围

    SQL中的RAND函数能够满足多种随机数生成的需求。通过合理地使用种子、结合一些SQL语句&#xff0c;我们可以实现灵活的随机数生成。在数据填充、数据处理、数据分析中经常需要用RAND生成的随机数。 用法1 生成随机浮点数&#xff0c;其返回值在0&#xff08;包括0&#xff09;…...

    PHP7内核剖析 学习笔记 第七章 面向对象

    面向对象编程&#xff0c;简称OOP&#xff0c;是一种程序设计思想。面向对象把对象作为程序的基本单元&#xff0c;一个对象包含了数据和操作数据的函数。面向对象一直是软件开发领域内比较热门的话题&#xff0c;它更符合人类看待事物的一般规律。与Java不同&#xff0c;PHP并…...

    地信GIS专业关于学习、考研、就业方面的一些问题答疑

    整理了地信GIS专业学生问得最多的几个问题&#xff1a;关于GIS专业学习、考研以及就业方面&#xff1b;大家可以一起来探讨一下。 学习方面 1、 作为一名GISer需要哪些核心素养或能力&#xff1f; 答&#xff1a;GIS是个交叉学科&#xff0c;涉及到地理学、地质学、测绘、遥感…...

    构建可重复的系统 - SRE 的 IaC 与 CI/CD 基础

    构建可重复的系统 - SRE 的 IaC 与 CI/CD 基础 还记得我们在第一篇提到的 SRE 核心原则之一——减少琐事 (Toil) 吗?想象一下手动配置服务器、部署应用程序、管理网络规则……这些任务不仅耗时、重复,而且极易出错。当系统规模扩大时,手动操作很快就会变得难以为继。SRE 的核…...

    CQF预备知识:一、微积分 —— 1.2.2 函数f(x)的类型详解

    文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 &#x1f4d6; 数学入门全解 本教程为复习课程&#xff0c;旨在帮助读者复习数学知识。教程涵盖以下四个主题&#xff1a; 微积分线性代数微…...

    PyQt学习系列03-动画与过渡效果

    PyQt学习系列笔记&#xff08;Python Qt框架&#xff09; 第三课&#xff1a;PyQt的动画与过渡效果 一、动画与过渡效果概述 1.1 动画与过渡的区别 动画&#xff08;Animation&#xff09;&#xff1a;用于描述对象属性随时间变化的过程&#xff08;如位置、颜色、大小&…...

    偏微分方程数值方法指南及AI推理

    偏微分方程&#xff08;PDE&#xff09;是我们用来描述科学、工程和金融领域中各种现象的语言——从流体流动和热传递到波的传播和金融衍生品的定价。然而&#xff0c;这些方程的解析解通常难以获得&#xff0c;尤其是在处理复杂几何形状或非线性行为时。这时&#xff0c;数值方…...

    flask允许跨域访问如何设置

    flask允许跨域访问 在Flask中,允许跨域访问通常涉及到CORS(跨源资源共享)策略。Flask本身并不直接提供CORS支持,但你可以通过安装和使用第三方库如Flask-CORS来轻松实现跨域资源共享。 安装Flask-CORS 首先,你需要安装Flask-CORS。你可以使用pip来安装它: pip instal…...

    深度学习模型部署:使用Flask将图像分类(5类)模型部署在服务器上,然后在本地GUI调用。(全网模型部署项目步骤详解:从模型训练到部署再到调用)

    个人github对应项目链接&#xff1a; https://github.com/KLWU07/Image-classification-and-model-deployment 1.流程总览 2.图像分类的模型—Alexnet 3.服务器端部署及运行 4.本地PyCharm调用—GUI界面 一、流程总览 本项目方法还是使用Flask 库&#xff0c;与之前一篇机器学…...

    在Pycharm中如何安装Flask

    &#xff08;推荐&#xff09;方法一&#xff1a;在Pycharm中创建项目之后&#xff0c;再安装Flask 1&#xff1a;在创建Pycharm时&#xff0c;解释器类型选择第一个&#xff1a;项目venv&#xff08;自动生成的虚拟环境&#xff09;&#xff0c;在左下角选择终端&#xff08;…...

    基于Scikit-learn与Flask的医疗AI糖尿病预测系统开发实战

    引言 在精准医疗时代&#xff0c;人工智能技术正在重塑临床决策流程。本文将深入解析如何基于MIMIC-III医疗大数据集&#xff0c;使用Python生态构建符合医疗AI开发规范的糖尿病预测系统。项目涵盖从数据治理到模型部署的全流程&#xff0c;最终交付符合DICOM标准的临床决策支…...

    解决前端路由切换导致Keycloak触发页面刷新问题

    使用window.location.href进行页面跳转时,浏览器会完全刷新页面,这会导致当前的JavaScript上下文被清空。 如果你的登录状态依赖于某些临时存储(如LocalStorage或sessionStorage),而这些存储在页面刷新后未正确初始化或丢失,就会导致用户被认为未登录。触发keycloak再次登录导…...

    基于大模型的胫腓骨干骨折全周期预测与治疗方案研究报告

    目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 国内外研究现状 二、大模型技术原理与应用基础 2.1 大模型的基本架构与算法 2.2 医疗数据的收集与预处理 2.2.1 数据收集 2.2.2 数据预处理 2.3 模型训练与优化 2.3.1 模型训练过程 2.3.2 参数调整与超…...

    智慧交通的核心引擎-车牌识别接口-车牌识别技术-新能源车牌识别

    在数字化与智能化浪潮席卷交通运输领域的今天&#xff0c;车牌识别接口功能正以其精准、高效的特性&#xff0c;成为构建智慧交通体系的关键技术支撑。通过自动采集、识别车牌信息并实现数据互通&#xff0c;该功能已被深度融入交通管理、物流运输、出行服务等多个场景&#xf…...

    小白的进阶之路系列之三----人工智能从初步到精通pytorch计算机视觉详解上

    计算机视觉是教计算机看东西的艺术。 例如,它可能涉及构建一个模型来分类照片是猫还是狗(二元分类)。 或者照片是猫、狗还是鸡(多类分类)。 或者识别汽车出现在视频帧中的位置(目标检测)。 或者找出图像中不同物体可以被分离的位置(全视分割)。 计算机视觉应用在…...

    手写简单的tomcat

    首先&#xff0c;Tomcat是一个软件&#xff0c;所有的项目都能在Tomcat上加载运行&#xff0c;Tomcat最核心的就是Servlet集合&#xff0c;本身就是HashMap。Tomcat需要支持Servlet&#xff0c;所以有servlet底层的资源&#xff1a;HttpServlet抽象类、HttpRequest和HttpRespon…...

    院校机试刷题第九天:P1042乒乓球、回顾代码随想录第二天

    定位一下刷题计划&#xff1a;刷题全面——代码随想录过一遍&#xff0c;刷到模拟题——刷洛谷普及组-。所以还是每天刷一个代码随想录&#xff0c;外加两道洛谷&#xff0c;题目先从官方题单【算法1-1】开始。 一、P1042乒乓球 1.解题思路 关键点1&#xff1a;输入形式 输…...

    如何在 Mac M4 芯片电脑上卸载高版本的 Node.js

    文章目录 一、确认 Node.js 的安装方式二、卸载 Node.js 的通用步骤1. 通过官方安装包&#xff08;.pkg&#xff09;安装的 Node.js2. 通过 Homebrew 安装的 Node.js3. 通过 nvm 安装的 Node.js 三、验证是否卸载成功四、推荐使用 nvm 管理 Node.js 版本五、常见问题1. 卸载后仍…...

    基础IO详解

    FILE 1.FILE是文件的用户级数据结构&#xff0c;创建在堆上 2.FILE里有维护一个用户级缓冲区&#xff0c;这个用户级缓冲区是为了减少系统调用的次数 3.进程一般会有三个标准FILE*流&#xff0c;stdin&#xff0c;stdout&#xff0c;stderr&#xff0c;对应文件描述符一般是…...

    QT入门基础

    QT作为一个C的GUI框架&#xff0c;编程语法和C都差不多&#xff0c;上手还是比较快的。但是学习一个新的技术&#xff0c;总有一些新的概念是不清楚的&#xff0c;所以需要先了解一下这些概念。 1、QT软件系 QT&#xff1a;安装时会指定某个版本的QT&#xff0c;这个QT指QT库…...

    【TI MSP430与SD NAND:心电监测的长续航解决方案】

    在医疗科技飞速发展的今天&#xff0c;心电监测设备已成为守护人们心脏健康的关键防线。而在这一领域&#xff0c;Nordic、TI、ST、NXP 等行业巨头凭借其深厚的技术积累和创新精神&#xff0c;推出的主芯片与 SD NAND 存储组合方案&#xff0c;正引领着心电监测技术的变革&…...

    中医方剂 - 理中汤

    理中汤是中医经典方剂&#xff0c;出自《伤寒论》&#xff0c;由人参&#xff08;或党参&#xff09;、干姜、白术、炙甘草四味药组成。 一、核心功效与作用机理 1. 温中散寒&#xff08;核心作用&#xff09; 表现&#xff1a;脘腹冷痛、呕吐清水、腹泻完谷不化 现代对应&a…...

    遨游三防科普:三防平板是什么?有什么特殊功能?

    在极端环境作业与专业领域应用中&#xff0c;传统消费级电子设备往往因环境适应性不足而“折戟沉沙”。三防平板的诞生&#xff0c;正是为破解这一难题而生&#xff0c;它通过军用级防护标准与专业化功能设计&#xff0c;成为工业巡检、地质勘探、应急救援等场景的核心工具。所…...

    关于数据仓库、数据湖、数据平台、数据中台和湖仓一体的概念和区别

    我们谈论数据中台之前&#xff0c; 我们也听到过数据平台、数据仓库、数据湖、湖仓一体的相关概念&#xff0c;它们都与数据有关系&#xff0c;但他们和数据中台有什么样的区别&#xff0c; 下面我们将围绕数据平台、数据仓库、数据湖和数据中台的区别进行介绍。 一、相关概念…...

    FPGA:CLB资源以及Verilog编码面积优化技巧

    本文将先介绍Kintex-7系列器件的CLB&#xff08;可配置逻辑块&#xff09;资源&#xff0c;然后分享在Verilog编码时节省CLB资源的技巧。以下内容基于Kintex-7系列的架构特点&#xff0c;并结合实际设计经验进行阐述。 一、Kintex-7系列器件的CLB资源介绍 Kintex-7系列是Xilin…...

    AUTOSAR AP 入门0:AUTOSAR_EXP_PlatformDesign.pdf

    AUTOSAR AP官网&#xff1a;AUTOSAR Adaptive Platform设计AUTOSAR AP的目的&#xff0c;翻译版官方文档 AUTOSAR_EXP_PlatformDesign.pdf &#xff1a; https://mp.weixin.qq.com/s?__bizMzg2MzAyMDIzMQ&mid2247553050&idx2&sn786c3a1f153acf99b723bf4c9832acaf …...

    WPF 常见坑:ContentControl 不绑定 Content 时,命令为何失效?

    WPF 中的 Content“{Binding}” 到底有多重要&#xff1f;一次被忽视的绑定导致命令无法触发的案例分析 在使用 WPF 构建 UI 时&#xff0c;我们经常会使用 ContentControl、ItemsControl、DataTemplate 等机制进行灵活的界面布局。但很多开发者可能会在某些场景中遇到这样的问…...

    【IC_Design】跨时钟域的寄存器更新后锁存

    目录 设计逻辑框图场景概述总结电路使用注意事项***波形图代码 设计逻辑框图 场景概述 最典型的应用场景就是——在一个时钟域&#xff08;比如 CPU/总线域&#xff09;更新了一个多位配置字&#xff0c;需要把它安全地送到另一个时钟域&#xff08;比如时钟发生器、串口、视频…...

    腾讯2025年校招笔试真题手撕(三)

    一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…...

    leetcode 83和84 Remove Duplicates from Sorted List 和leetcode 1836

    目录 83. Remove Duplicates from Sorted List 82. Remove Duplicates from Sorted List II 1836. Remove Duplicates From an Unsorted Linked List 删除链表中的结点合集 83. Remove Duplicates from Sorted List 代码&#xff1a; /*** Definition for singly-linked l…...

    【linux知识】sftp配置免密文件推送

    SFTP配置免密文件推送 **一、配置 SFTP 用户****1. 创建系统用户&#xff08;非登录用户&#xff09;****2. 设置用户密码****3. 创建 SFTP 根目录并设置权限****4. 配置 SFTP 服务&#xff08;修改 SSH 配置&#xff09;****5. 重启 SSH 服务使配置生效** **二、免密 SFTP 文件…...

    华为2025年校招笔试手撕真题教程(二)

    一、题目 大湾区某城市地铁线路非常密集&#xff0c;乘客很难一眼看出选择哪条线路乘坐比较合适&#xff0c;为了解决这个问题&#xff0c;地铁公司希望你开发一个程序帮助乘客挑选合适的乘坐线路&#xff0c;使得乘坐时间最短&#xff0c;地铁公司可以提供的数据是各相邻站点…...

    【Leetcode 每日一题】3362. 零数组变换 III

    问题背景 给你一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries&#xff0c;其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li​,ri​]。 每一个 q u e r i e s [ i ] queries[i] queries[i]…...

    JWT了解

    JSON Web Token (JWT) 概述 JSON Web Token (JWT) 是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;用于在网络应用环境间安全地将信息作为JSON对象传输。它通常被用来在客户端和服务器之间传递声明&#xff0c;例如用户的身份验证信息&#xff0c;使得服务端可以…...

    复杂项目中通过使用全局变量解决问题的思维方式

    最近接手了一个公司的老系统的PHP项目&#xff0c;里面的代码比较混乱&#xff0c;排查解决了一个问题&#xff0c;决定将这个思路记录下来&#xff0c;希望能帮助更多的人。 其中一部分的代码信息如下&#xff1a; 备注&#xff1a;为了避免公司的相关数据信息暴露&#xff0…...

    upload-labs通关笔记-第18关文件上传之条件竞争

    目录 一、条件竞争 二、源码分析 1、源码分析 2、攻击原理 3、渗透思路 三、实战渗透 1、构造脚本 2、获取上传脚本URL 3、构造访问母狼脚本的Python代码 4、bp不断并发上传母狼脚本 &#xff08;1&#xff09;开启专业版bp &#xff08;2&#xff09; 上传母狼脚本…...

    华为Cangjie编程技术深度解析(续篇1)

    华为Cangjie编程技术深度解析(续篇) 第六章 分布式运行时深度剖析 6.1 设备虚拟化引擎 Cangjie设备抽象层(DAL)原理 // 设备能力声明式描述 @DeviceProfile(id = "AGV-0023",capabilities = {mobility: { speed: 1.5m/s, payload: 50kg },sensors: [lidar, t…...

    WordPress AI插件 新增支持一键批量自动生成WooCommerce 产品描述、产品图、产品评论

    Linkreate wordpressAI智能插件-自动化运营网站 文章生成与优化|多语言文章生成|关键词生成与分类管理|内容采集与管理|定时任务与自动|多任务后台运行|API集成与AI客服|媒体生成功能 一款可以24小时自动发布原创文章的WordPress插件&#xff0c;支持AI根据已有的长尾关键词、关…...

    如何测试JWT的安全性:全面防御JSON Web Token的安全漏洞

    在当今的Web应用安全领域&#xff0c;JSON Web Token(JWT)已成为身份认证的主流方案&#xff0c;但OWASP统计显示&#xff0c;错误配置的JWT导致的安全事件占比高达42%。本文将系统性地介绍JWT安全测试的方法论&#xff0c;通过真实案例剖析典型漏洞&#xff0c;帮助我们构建全…...