C标准库源码解剖(4):字符串处理函数string.h和wchar.h

2023-05-16

    string.h中包含了所有的字符串处理函数,也包含了内存处理函数,因为这些内存处理函数(如比如、复制、搜索)的功能与字符串处理函数功能类似。我们是用通用指针来指向内存块的,通用指针可以用char*类型(传统C语言),也可以用void*类型(标准C语言)。每个函数都有对应的宽字符版本,在wchar.h中。
    string.h中包含的标准库函数:strcat,strncat,strcmp,strncmp,strcpy,strncpy,strlen,strchr,strrchr,strspn,strcspn,strpbrk, strstr,strok,strcoll,strxfrm,strerror; memcpy,memmove,memcmp,memchr,memeset。GNU还提供了很多非标准的扩展,如memccpy,rawmemchr,memrchr, strdup,strndup等。

/* ISO C99 Standard: 7.21 字符串处理	<string.h> */
#ifndef	_STRING_H
#define	_STRING_H	1
#include <features.h> /* 非标准头文件,定义了一些编译选项 */
__BEGIN_DECLS
/* 从<stddef.h>中获得size_t和NULL  */
#define	__need_size_t
#define	__need_NULL
#include <stddef.h>
__BEGIN_NAMESPACE_STD
/* 从SRC中复制N个字节的内容到DEST中  */
extern void *memcpy (void *__restrict __dest,
		     __const void *__restrict __src, size_t __n)
     __THROW __nonnull ((1, 2));
/* 从SRC中复制N个字节的内容到DEST中,保证对重叠字符串(即SRC与DEST共用存储空间)有正确的行为 */
extern void *memmove (void *__dest, __const void *__src, size_t __n)
     __THROW __nonnull ((1, 2));
__END_NAMESPACE_STD
/* 从SRC中复制不超过N个字节的内容到DEST中,当遇到字符C时便停止,返回DEST中C的拷贝后面的字符指针。
    如果在SRC的前面N个字节中没有发现字符C,则返回NULL */
#if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN
extern void *memccpy (void *__restrict __dest, __const void *__restrict __src,
		      int __c, size_t __n)
     __THROW __nonnull ((1, 2));
#endif /* SVID.  */
__BEGIN_NAMESPACE_STD
/* 把S的前N个字节的内容设置为C */
extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
/* 比较S1和S2的前n字节的内容 */
extern int memcmp (__const void *__s1, __const void *__s2, size_t __n)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 在S的前N个字节中搜索C的第一次出现  */
extern void *memchr (__const void *__s, int __c, size_t __n)
      __THROW __attribute_pure__ __nonnull ((1));
__END_NAMESPACE_STD
#ifdef __USE_GNU
/* 在S中搜索C,这与“memchr”类似,但这里没有长度的限制 */
extern void *rawmemchr (__const void *__s, int __c)
     __THROW __attribute_pure__ __nonnull ((1));
/* 在S的前N个字节中搜索C的最后一次出现  */
extern void *memrchr (__const void *__s, int __c, size_t __n)
      __THROW __attribute_pure__ __nonnull ((1));
#endif
__BEGIN_NAMESPACE_STD
/* 将SRC复制到DEST中  */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
     __THROW __nonnull ((1, 2));
/* 将SRC的前N个字符复制到DEST  */
extern char *strncpy (char *__restrict __dest,
		      __const char *__restrict __src, size_t __n)
     __THROW __nonnull ((1, 2));
/* 将SRC追加到DEST */
extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
     __THROW __nonnull ((1, 2));
/* 将SRC的前N个字符追加到DEST */
extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
		      size_t __n) __THROW __nonnull ((1, 2));
/* 比较S1和S2 */
extern int strcmp (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 比较S1和S2的前N个字符 */
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 比较S1和S2对照后的形式(即按特定区域设置来进行字符排序) */
extern int strcoll (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 对SRC作转换并放到DEST的前N个字节中 */
extern size_t strxfrm (char *__restrict __dest,
		       __const char *__restrict __src, size_t __n)
     __THROW __nonnull ((2));
__END_NAMESPACE_STD
#ifdef __USE_GNU
/* 下面的函数与上面的两个等价,但它们带一个额外的区域设置参数,用于设置字符对照规则。
    这是非标准的函数,但是在不久之后有可能会被标准化 */
# include <xlocale.h>
/* 使用L中的规则来比较S1和S2对照后的形式 */
extern int strcoll_l (__const char *__s1, __const char *__s2, __locale_t __l)
     __THROW __attribute_pure__ __nonnull ((1, 2, 3));
/* 对SRC作转换并放到DEST的前N个字节中 */
extern size_t strxfrm_l (char *__dest, __const char *__src, size_t __n,
			 __locale_t __l) __THROW __nonnull ((2, 4));
#endif
#if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
/* 复制S,返回一个相同的副本 */
extern char *strdup (__const char *__s)
     __THROW __attribute_malloc__ __nonnull ((1));
#endif
/* 返回STRING的前N个字节的副本。即使STRING[N]前面没有出现终止符,
    结果字符串也会被终止 */
#if defined __USE_GNU
extern char *strndup (__const char *__string, size_t __n)
     __THROW __attribute_malloc__ __nonnull ((1));
#endif
#if defined __USE_GNU && defined __GNUC__
/* 复制S,返回一个相同的副本 */
# define strdupa(s)							      /
  (__extension__							      /
    ({									      /
      __const char *__old = (s);					      /
      size_t __len = strlen (__old) + 1;				      /
      char *__new = (char *) __builtin_alloca (__len);			      /
      (char *) memcpy (__new, __old, __len);				      /
    }))
/* 返回字符串前N个字节的副本 */
# define strndupa(s, n)							      /
  (__extension__							      /
    ({									      /
      __const char *__old = (s);					      /
      size_t __len = strnlen (__old, (n));				      /
      char *__new = (char *) __builtin_alloca (__len + 1);		      /
      __new[__len] = '/0';						      /
      (char *) memcpy (__new, __old, __len);				      /
    }))
#endif
__BEGIN_NAMESPACE_STD
/* 在S中搜索C的第一次出现 */
extern char *strchr (__const char *__s, int __c)
     __THROW __attribute_pure__ __nonnull ((1));
/* 在S中搜索C的最后一次出现  */
extern char *strrchr (__const char *__s, int __c)
     __THROW __attribute_pure__ __nonnull ((1));
__END_NAMESPACE_STD
#ifdef __USE_GNU
/* 这个函数与“strchr”类似,但如果在S中没有找到C,则它返回一个指向NUL终止符的指针 */
extern char *strchrnul (__const char *__s, int __c)
     __THROW __attribute_pure__ __nonnull ((1));
#endif
__BEGIN_NAMESPACE_STD
/* 返回S中的第一个子串长度,这个子串的所有字符都不在REJECT中 */
extern size_t strcspn (__const char *__s, __const char *__reject)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 返回S中的第一个子串长度,这个子串的所有字符都在ACCEPT中 */
extern size_t strspn (__const char *__s, __const char *__accept)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 返回S中的第一个在ACCEPT中出现的字符指针 */
extern char *strpbrk (__const char *__s, __const char *__accept)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 查找字符串NEEDLE在HAYSTACK中第一次出现  */
extern char *strstr (__const char *__haystack, __const char *__needle)
     __THROW __attribute_pure__ __nonnull ((1, 2));
/* 用DELIM中的字符作为分隔符把S解析成多个记号 */
extern char *strtok (char *__restrict __s, __const char *__restrict __delim)
     __THROW __nonnull ((2));
__END_NAMESPACE_STD
/* 用DELIM中的字符作为分隔符把S分解为多个记号,上一次调用的信息存储在SAVE_PTR中 */
extern char *__strtok_r (char *__restrict __s,
			 __const char *__restrict __delim,
			 char **__restrict __save_ptr)
     __THROW __nonnull ((2, 3));
#if defined __USE_POSIX || defined __USE_MISC
extern char *strtok_r (char *__restrict __s, __const char *__restrict __delim,
		       char **__restrict __save_ptr)
     __THROW __nonnull ((2, 3));
#endif
#ifdef __USE_GNU
/* 与“strstr”类似,但这个函数忽略字符串的大小写 */
extern char *strcasestr (__const char *__haystack, __const char *__needle)
     __THROW __attribute_pure__ __nonnull ((1, 2));
#endif
#ifdef __USE_GNU
/* 在HAYSTACK中查找NEEDLE的第一次出现。NEEDLE为NEEDLEN个字节长,
    HAYSTACK为HAYSTACKLEN个字节长 */
extern void *memmem (__const void *__haystack, size_t __haystacklen,
		     __const void *__needle, size_t __needlelen)
     __THROW __attribute_pure__ __nonnull ((1, 3));
/* 将SRC的N个字节复制到DEST,返回最后一个写入字节后面位置的指针 */
extern void *__mempcpy (void *__restrict __dest,
			__const void *__restrict __src, size_t __n)
     __THROW __nonnull ((1, 2));
extern void *mempcpy (void *__restrict __dest,
		      __const void *__restrict __src, size_t __n)
     __THROW __nonnull ((1, 2));
#endif
__BEGIN_NAMESPACE_STD
/* 返回S的长度 */
extern size_t strlen (__const char *__s)
     __THROW __attribute_pure__ __nonnull ((1));
__END_NAMESPACE_STD
#ifdef	__USE_GNU
/* 查找STRING的长度,但只扫描前MAXLEN个字符,如果其中没有发现'/0'终止符,则返回MAXLEN */
extern size_t strnlen (__const char *__string, size_t __maxlen)
     __THROW __attribute_pure__ __nonnull ((1));
#endif
__BEGIN_NAMESPACE_STD
/* 返回对错误码ERRNUM的字符串描述  */
extern char *strerror (int __errnum) __THROW;
__END_NAMESPACE_STD
/* 下面都是非标准扩展或内部使用的函数 */
__END_DECLS
#endif /* string.h  */

    1、字符串连接strcat,strncat,wcscat,wcsncat:将字符串src(或其前n个字符)连接到dest,后面两个是宽字符版本。

/* strcat.c:strcat函数的实现  */
#include <string.h>
#include <memcopy.h> /* 非标准头文件,定义了reg_char类型 */
#undef strcat
/* 将字符串SRC连接到DEST */
char *
strcat (dest, src)
     char *dest;
     const char *src;
{
  char *s1 = dest;
  const char *s2 = src;
  reg_char c; /* reg_char在memcopy.h中定义,就是char类型,它表示c存储在register中 */
  
  do    /* 让s1指向dest的终止位置,即首个'/0'的下一位置  */
    c = *s1++;
  while (c != '/0');
  s1 -= 2; /* 让s1指向dest中的终止符'/0'的前一个位置,这样就可以进行连接操作了 */
  do     /* 做连接操作 */
    {
      c = *s2++;
      *++s1 = c;
    }
  while (c != '/0');
  return dest;
}
libc_hidden_builtin_def (strcat)

/* strncat.c:strncat函数的实现 */
#include <string.h>
#ifdef _LIBC
# include <memcopy.h> /* 非标准头文件,定义了reg_char类型,就是char类型 */
#else
typedef char reg_char;
#endif
#undef strncat
/* 将s2的前n个字符连接到s1,若s2不足n个字符,则连接完s2(包括终止符)后
    就返回 */
char *
strncat (s1, s2, n)
     char *s1;
     const char *s2;
     size_t n;
{
  reg_char c;
  char *s = s1;
  do  /* 让s1指向dest的终止位置,即首个'/0'的下一位置  */
    c = *s1++;
  while (c != '/0');
  s1 -= 2; /* 让s1指向dest中的终止符'/0'的前一个位置,这样就可以进行连接操作了 */
  if (n >= 4)      /* 做连接操作,每4个字符作为一组来进行连接 */
    {
      size_t n4 = n >> 2; /* 让n除以4,计算出循环次数 */
      do
	{
	  c = *s2++;     /* 每次循环都要连接4个字符,总共连接了4*n4个字符 */
	  *++s1 = c;
	  if (c == '/0') /* 在连接时,每当遇到'/0',连接操作就停止,并返回目标串 */
	    return s;
	  c = *s2++;
	  *++s1 = c;
	  if (c == '/0')
	    return s;
	  c = *s2++;
	  *++s1 = c;
	  if (c == '/0')
	    return s;
	  c = *s2++;
	  *++s1 = c;
	  if (c == '/0')
	    return s;
	} while (--n4 > 0);
      n &= 3; /* 求出n除以4的余数 */
    }
  while (n > 0) /* 对剩下的几个字符(最多3个)进行连接 */
    {
      c = *s2++;
      *++s1 = c;
      if (c == '/0')
	return s;
      n--;
    }
  if (c != '/0')  /* 如果末尾不是终止符,则要补上一个终止符 */
    *++s1 = '/0';
  return s;
}

    解释:
    (1)strcat基本思想:把指针移到dest的终止符'/0'的前一个位置,然后扫描src的每个字符并连接到dest的后面。
    (2)strncat基本思想:为减少扫描的循环次数以提高效率,对src的每4个字符作为一组来进行连接,让n除以4,计算出循环次数n4。每次循环都要连接4个字符,总共连接了4*n4个字符,最后对剩下的几个字符(最多3个)进行连接。若src的第n个字符不是终止符'/0',则连接的末尾还要补上一个终止符。
    2、字符串比较strcmp,strncmp,wcscmp,wcsncmp:按照字典顺序比较两个字符串(或其前n个字符)的大小。

/* strcmp.c:strcmp函数的实现  */
#include <string.h>
#include <memcopy.h>  /* 非标准头文件,定义了reg_char类型 */
#undef strcmp
/* 比较S1和S2,小于返回小于0的数,等于时返回0,大于时返回大于0的数 */
int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;
  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '/0')  /* 若s1终止,则比较结束,返回相应差值 */
	return c1 - c2;
    }
  while (c1 == c2); /* 做相等比较,直到不相等时退出循环 */
  return c1 - c2;  /* 返回相应的差值 */
}
libc_hidden_builtin_def (strcmp)

/* strncmp.c:strncmp函数的实现 */
#include <string.h>
#include <memcopy.h>
#undef strncmp
/* 比较s1和s2的前n个字符,不足n个字符时使用整个字符串,
    小于返回小于0的数,等于时返回0,大于时返回大于0的数 */
int
strncmp (s1, s2, n)
     const char *s1;
     const char *s2;
     size_t n;
{
  unsigned reg_char c1 = '/0';
  unsigned reg_char c2 = '/0';
  if (n >= 4)      /* 做比较操作,每4个字符作为一组来进行比较 */
    {
      size_t n4 = n >> 2;  /* 做比较操作,每4个字符作为比较来进行连接 */
      do
	{
	  c1 = (unsigned char) *s1++; /* 每次循环都要比较4个字符,总共比较了4*n4个字符 */
	  c2 = (unsigned char) *s2++;
	  if (c1 == '/0' || c1 != c2)/* 每当遇到s1终止或c1!=c2,比较操作就结束,并返回相应差值 */
	    return c1 - c2;
	  c1 = (unsigned char) *s1++;
	  c2 = (unsigned char) *s2++;
	  if (c1 == '/0' || c1 != c2)
	    return c1 - c2;
	  c1 = (unsigned char) *s1++;
	  c2 = (unsigned char) *s2++;
	  if (c1 == '/0' || c1 != c2)
	    return c1 - c2;
	  c1 = (unsigned char) *s1++;
	  c2 = (unsigned char) *s2++;
	  if (c1 == '/0' || c1 != c2)
	    return c1 - c2;
	} while (--n4 > 0);
      n &= 3;  /* 求出n除以4的余数 */
    }
  while (n > 0) /* 对剩下的几个字符(最多3个)进行比较 */
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '/0' || c1 != c2)  /* 若s1终止或c1!=c2,则比较结束,返回相应差值 */
	return c1 - c2;
      n--;
    }
  return c1 - c2;  /* 返回相应差值 */
}
libc_hidden_builtin_def (strncmp)

    解释:
    (1)strcmp基本思想:扫描两个串,并对字符作相等比较,直到不相等时退出循环,返回这两个字符的差值。
    (2)strncmp基本思想:做比较操作,每4个字符作为一组来进行比较,以提高效率。扫描两个串,每次循环时连续比较4个字符,直到比较完前n个字符。

转载于:https://my.oschina.net/abcijkxyz/blog/723219

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C标准库源码解剖(4):字符串处理函数string.h和wchar.h 的相关文章

  • 光流定点若干问题分析

    一 光流摄像头移动速度快慢对结果的影响 实际测试发现 xff0c 在一定高度水平慢速移动光流摄像头20个单位长度 xff0c 光流累加值为6 9 Pixel xff0c 水平快速移动光流摄像头20个单位长度 xff0c 光流累加值为50 6
  • 光流定点程序梳理

    本文主要分析飞控获取到光流数据之后 xff0c 如何实现定点 xff0c 至于光流算法 xff0c 不在本文讨论范围内 官网介绍的PX4 Flow采用STM32F4作为主控 xff0c 定点效果不错 xff0c 但价格稍贵 xff0c 而且
  • 关于SM2加密验签的操作

    对接银行的统一收单系统 xff0c 用到SM2加密验签流程 xff1a 1 xff1a 统一收单系统对接平台商户需要向CFCA申请复合证书 xff0c 一个用于商户签名 xff0c 另外一个用于报文加密 2 xff1a 平台商户入驻成功后
  • Vue脚手架运行报错multi-word-component-names

    问题描述 Vue脚手架运行的报错 error Component name Union should always be multi word vue multi word component names You may use speci
  • ucosIII学习总结

    看到以前写的ucos博客还有人看 xff0c 感到很欣慰 xff0c 写篇博客给刚学习ucos的同学一些建议 xff0c 希望对你们的学习有所帮助 写在前面 xff0c 当初学ucos完全是误打误撞 xff0c 从单片机一路走来 xff0c
  • Ubuntu 18.04 手动配置分区并安装

    环境说明 安装环境 xff1a VMWare WorkStations Pro 15 5 1 操作系统 xff1a ubuntu 18 04 4 desktop amd64 CPU xff1a 4 核 内存 xff1a 8 GB 磁盘 xf
  • Make 命令(持续更新)

    一 背景 Make是最常用的构建工具 xff0c 诞生于1977年 xff0c 主要用于C语言的项目 但是实际上 xff0c 任何只要某个文件有变化 xff0c 就要重新构建 的项目 xff0c 都可以用Make构建 make只是一个根据指
  • linux c++ 服务器端开发面试必看书籍

    摘自别人博客 xff0c 地址 xff1a http blog csdn net qianggezhishen article details 45951095 打算从这开始一本一本开始看 题外话 xff1a 推荐一个 github 上的
  • K8s网络实战分析之service调用

    在上一篇文章K8s网络实战分析之Calico ipip模式中 xff0c 我们通过Pod之间进行ping操作 xff0c 对基于Calico IPIP模式的K8s网络进行了实战学习与分析 单单进行Pod Pod的访问只是K8s的基础功能 x
  • RTK(Real - time kinematic,实时动态)载波相位差分技术

    GPS和RTK区别在于 xff1a 二者bai指代du不同 二者作用不同 二者原理不同 1 二者指代不同 xff1a RTK是载波dao相位差分技术 xff0c 是实时处理两个测量站载波相位观测量的差分方法 xff1b GPS是全球定位系统
  • RTK+GPS提高定位精度原理解析

    RTK 43 GPS提高定位精度原理解析 xff08 一个小白写给另一个小白系列 xff09 GPS定位原理回顾RTK基本概念RTK组成RTK传输差分示意RTK数据链接坐标转换RTK应用后记 我们在上一篇文章导航定位系统的原理解析 xff0
  • GPS、RTK、PPK三种定位技术的原理及应用

    一 GPS技术 1 原理 之前做过集成GPS功能的产品 xff0c 对这种不以定位为主要功能的产品 xff0c 精度是没有要求的 xff0c 例如我只是用它来得到当前社区的位置 xff0c 一般的GPS模块都能满足要求 理论上 xff0c
  • AT命令与ppp协议

    AT 即Attention xff0c AT指令集是从终端设备 Terminal Equipment xff0c TE 或数据终端设备 Data Terminal Equipment xff0c DTE 向终端适配器 Terminal Ad
  • 无人机开发-图传技术

    2016年 xff0c 是中国无人机市场的元年 xff0c 无人机能够一跃进入大众视野 xff0c 并迅速在大众市场火热发展 xff0c 是很多人始料未及的 从刚开始的空中摄录 xff0c 到后来的实时摄录 xff0c 方便的无人机图传功能
  • 无人机飞行原理

    一 无人机的飞行原理 旋翼和轮子一样 xff0c 是一项神奇的发明 四旋翼无人机更是化作了航拍机 xff0c 满足了许多普通人关于天空的想象 旋翼之所以能飞 xff0c 玩过竹蜻蜓的朋友应该都知道 xff1a 当手的搓动给了竹蜻蜓一个旋转的
  • 汽车电子(一)--- 整车CAN网络介绍

    在了解can网络之前 先了解1个问题 什么是智能硬件与ECU 何为智能硬件 就是包含智能控制单元的硬件 比如发动机 发动机上有一块儿专门负责控制发动机进气量 喷油量 排气量的控制单元 这块单元相当于发动机的大脑 他具有信号发送 信号接收 参
  • 三大框架之hibernate入门学习教程增删改查

    好久没更新分享了 xff01 现在发下三大框架的hibernate便于初学者学习 xff01 另外struts2的那些配置文件代码可以找我要 xff0c 里面包括如何自定义拦截器等等 开始hibernate的学习吧 xff01 首先不多说先
  • 程序员工作5年以上,找工作还看学历吗?

    很多程序员都有这样的觉悟 xff1b 找工作学历是敲门砖 xff0c 没有211 985起步的学历 xff0c 想进一家大公司不太可能 举个例子好了 xff1b 如果你是大厂面试官 xff0c 参与面试的有10个刚刚毕业没有工作经验的普通学
  • jquery ajax无刷新请求Struts2验证用户名密码数据库是否存在

    通过ajax请求验证后台数据是否存在 首先导入struts2的核心包 后台Action代码 import com opensymphony xwork2 ActionSupport public class CodeCheckAction
  • 手把手教你们通过jquery ajax调用查询java struts2后端数据+js拼接字符串

    1 首先新建一个web项目 xff0c 创建一个User实体 package com qm entity public class User private String id private String name private Str

随机推荐

  • python检查URL是否能正常访问

    今天 xff0c 项目经理问我一个问题 xff0c 问我这里有2000个URL要检查是否能正常打开 xff0c 其实我是拒绝的 xff0c 我知道因为要写代码了 xff0c 正好学了点python xff0c 一想 xff0c python
  • js自己写脚本自动操作注册插件,基于chrome浏览器

    大家好 xff01 又到了一周的福利时间 xff0c 今天给大家一个福利 xff0c 以后抢票不需要手动刷新页面了 xff0c 直接用你自己写的插件来控制 xff0c 事先声明 xff0c 本人是js菜鸟 xff0c 所以今天带来的例子都是
  • VMware Workstation Proa安装mac镜像

    首先你得有一个VMware 然后下载好mac镜像文件还有for OS X插件补丁 我这里都已经下载好了 xff0c 又需要的可以在评论里留下邮箱地址 xff0c 我分享给你 现在该有的文件都有了 xff0c 那么我们开始 首先VMware镜
  • Spring事务管理的四种方式(以银行转账为例)

    文章转自 https blog csdn net daijin888888 article details 51822257 本文配套示例代码下载地址 xff08 完整可运行 xff0c 含sql文件 xff0c 下载后请修改数据库配置 x
  • redis秒杀系统数据同步(保证不多卖)

    原文链接 http www cnblogs com shihaiming p 6062663 html 东西不多卖 秒杀系统需要保证东西不多卖 xff0c 关键是在多个客户端对库存进行减操作时 xff0c 必须加锁 Redis中的Watch
  • csdn过滤广告谷歌浏览器插件

    首先要知道浏览器插件的原理 通过访问网站 xff0c 加载我们写的js脚本 这样我们就可以对你所要操作的网站进行操作啦 xff01 首先看看谷歌的广告的代码块 如果换成你在开发这个网站 xff0c 肯定直接隐藏这个class 为 csdn
  • PX4源码分析1_PX4源码的下载和编译

    一 基本信息 xff1a 1 软件系统 xff1a Ubuntu 14 04 64bit 2 源码位置 xff1a https github com PX4 Firmware 3 参考博客 xff1a xff08 1 xff09 libin
  • PX4源码分析5_PX4启动流程

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 华为、TCL、大疆面试经历!32K高薪996和18K朝九晚五,我该怎么选?

    背景 楼主双非吊车尾一本毕业 xff0c 14年正式进入编程行业 xff0c 从事Android移动开发 一些个人的原因 xff0c 年前从一家公司裸辞 xff0c 带着老婆孩子离开了杭州 本想着回家过完年也就差不多赶上 金三银四 黄金季
  • PX4源码分析6_uorb通信机制

    一 创建流程 xff1a 在Firmware msg下创建msg文件 xff0c eg xff1a xxx msg xff0c 内容格式仿照原有msg文件在Firmware msg CMakeLists txt中将对应的msg文件添加 xf
  • PX4源码分析7_添加mavlink自定义消息

    一 自定义mavlink消息 xff1a 根据uorb消息 xff08 msg xff09 自定义mavlink消息 方法为利用mavlink generator工具在xml文件生成mavlink所需相应的头文件 二 发送自定义mavlin
  • Unix网络编程中第一个例子出现connect error: Connection refused

    这个问题我来回答 xff0c linux 现在因为安全问题 xff0c 各个发行版本默认是不开daytime服务的 由于要打开端口 xff0c 所以服务端程序需要用root权限执行 xff0c 所以你可以先 sudo daytimetcps
  • linux内存分配方法

    基于linux 驱动开发以及应用开发 当想要分配内存的时候 要面对很多的内存分配函数 malloc kmalloc vmalloc alloc page dma alloc 简单归纳如下 malloc 分配用户空间内存 不保证物理连续 xf
  • 算术移动和逻辑移动

    算术左移 逻辑左移 算术右移 逻辑右移有什么不同 算术左移 xff1a 末尾添0 xff1b 逻辑左移 xff1a 末尾添0 xff1b 算术右移 xff1a 左端最低位填充 xff1b 逻辑右移 xff1a 左端添0 算术左移和算术右移主
  • 素数的验证范围到数的开方

    假设范围大于数的开方 xff0c 则另个数必定小于数的开方 若两个数都大于数的开方 xff0c 则相乘必定大于这个数 所以只需要验证2到这个数的开方范围内就可以
  • CPU时间

    CPU时间 xff08 进程时间 xff09 xff1a 用户CPU时间 43 系统CPU时间 用户CPU时间 xff1a 用户态进程执行时间 系统CPU时间 xff1a 内核态进程执行时间 时钟时间 xff08 墙上时钟时间 xff09
  • 硬中断、软中断和信号

    硬中断是外部设备对CPU的中断 xff0c 软中断是中断底半部的一种处理机制 xff0c 信号则是由内核 xff08 或其他进程 xff09 对某个进程的中断 硬中断是由外部事件引起的因此具有随机性和突发性 xff1b 软中断是执行中断指令
  • CMakeLists.txt----一点儿自己的经验教训

    被CMakeLists txt坑过数次 xff08 大多是被自己蠢哭 xff09 xff0c 把用过的命令稍微记一下 注意 xff1a 中文空格等什么诡异字符 xff0c 链接库的名字不要忘记 xff0c 不要写错 好记性不如烂键盘 xff
  • docker命令之push

    1 背景 NAME docker push Push an image or a repository to the registry SYNOPSIS docker push NAME TAG DESCRIPTION Push an im
  • C标准库源码解剖(4):字符串处理函数string.h和wchar.h

    string h中包含了所有的字符串处理函数 xff0c 也包含了内存处理函数 xff0c 因为这些内存处理函数 xff08 如比如 复制 搜索 xff09 的功能与字符串处理函数功能类似 我们是用通用指针来指向内存块的 xff0c 通用指