<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=String.h</id>
	<title>String.h - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=String.h"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=String.h&amp;action=history"/>
	<updated>2026-06-27T11:10:37Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=String.h&amp;diff=736210&amp;oldid=prev</id>
		<title>2024年6月7日 (五) 05:59 210.71.216.241</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=String.h&amp;diff=736210&amp;oldid=prev"/>
		<updated>2024-06-07T05:59:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Merge to|C语言字符串处理|time=2023-07-30T05:55:33+00:00}}&lt;br /&gt;
{{unreferenced|time=2020-04-27T07:28:14+00:00}}&lt;br /&gt;
{{noteTA|G1=IT}}&lt;br /&gt;
{{C_Standard_library}} &amp;lt;!-- to edit this template go to [[template:C_Standard_library]] --&amp;gt;&lt;br /&gt;
{{lowercase|title=string.h}}&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;string.h&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;是[[C标准库]]的一個[[头文件]]，其中包含了[[宏]]（巨集）定义、常量以及函数和类型的声明，涉及的内容除了[[字符串]]处理之外，还包括大量的内存处理函数；因此，&amp;lt;code&amp;gt;string.h&amp;lt;/code&amp;gt;这个命名是不恰当的。&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;code&amp;gt;string.h&amp;lt;/code&amp;gt;中定义的函数十分常用，作为[[C标准库]]的一部分，它们被强制要求可以在任何支持C语言的平台上运行。但是，部分函数存在一些[[漏洞|安全隐患]]，例如[[缓存溢出]]等，导致程序员宁愿使用一些更安全的函数而放弃一定的可移植性。同时，这些字符串函数只能处理[[ASCII]]字符集或兼容ASCII的字符集，如[[ISO-8859-1]]；在处理存在多字节字符的字符集，如[[UTF-8]]时，会产生一个警告，指出对字符串“长度”的计算是以字节而不是以[[Unicode]]字符为单位。非ASCII兼容字符集的字符串处理函数一般位于&amp;lt;code&amp;gt;[[wchar.h]]&amp;lt;/code&amp;gt;中。&lt;br /&gt;
&lt;br /&gt;
==常量和类型==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;  || 表示[[空指针]]常量的宏，即表示一个&amp;#039;&amp;#039;&amp;#039;不&amp;#039;&amp;#039;&amp;#039;指向任何有效内存单元地址的指针常量。&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t&amp;lt;/code&amp;gt; || 无符号[[整型]]，被用于&amp;lt;code&amp;gt;[[sizeof]]&amp;lt;/code&amp;gt;运算符的返回值类型。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==函数==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 说明&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void    *[[memcpy]](void *dest, const void *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|将n字节长的内容从一个内存地址复制到另一个地址；如果两个地址存在重叠，则最终行为未定义&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void    *memmove(void *dest, const void *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|将n字节长的内容从一个内存地址复制到另一个地址；与&amp;lt;code&amp;gt;memcpy&amp;lt;/code&amp;gt;不同的是它可以正确作用于两个存在重叠的地址&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void    *memchr(const void *s, char c, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|在从s开始的n个字节内查找c第一次出现的地址并返回，若未找到则返回NULL&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int      memcmp(const void *s1, const void *s2, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|对从两个内存地址开始的n个字符进行比较&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void    *memset(void *, int, size_t);&amp;lt;/code&amp;gt;&lt;br /&gt;
|用某种字节内容覆写一段内存空间&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strcat]](char *dest, const char *src);&amp;lt;/code&amp;gt;&lt;br /&gt;
|在字符串dest之后连接上src&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strncat]](char *dest, const char *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|从src截取n个字符连接在字符串dest之后，返回dest字符串&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strchr]](const char* str, int ch);&amp;lt;/code&amp;gt;&lt;br /&gt;
|从字符串str头开始查找字符ch首次出现的位置&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strrchr]](const char* str,int ch);&amp;lt;/code&amp;gt;&lt;br /&gt;
|从字符串str尾开始查找字符ch首次出现的位置&lt;br /&gt;
|-&amp;lt;nowiki&amp;gt;&amp;lt;nowiki&amp;gt;请在这里插入非格式化文字&amp;lt;/nowiki&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;int      [[strcmp]](const char *, const char *);&amp;lt;/code&amp;gt;&lt;br /&gt;
|基于字典顺序比较两个字符串&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int      [[strncmp]](const char *, const char *, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|基于字典顺序比较两个字符串，最多比较n个字节&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int      [[strcoll]](const char *, const char *);&amp;lt;/code&amp;gt;&lt;br /&gt;
|基于当前[[区域设置]]的{{link-en|字符顺序|collating order}}比较两个字符串&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strcpy]](char* str1, const char* str2);&amp;lt;/code&amp;gt;&lt;br /&gt;
|将str2拷贝给str1&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strncpy]](char* str1, const char* str2, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|截取str2的n个字符拷贝给str1&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strerror]](int);&amp;lt;/code&amp;gt;&lt;br /&gt;
|返回错误码对应的解释字符串，参见[[errno.h]]（非线程安全函数）&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t   [[strlen]](const char *);&amp;lt;/code&amp;gt;&lt;br /&gt;
|返回一个字符串的长度&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t   [[strspn]](const char *s, const char *strCharSet);&amp;lt;/code&amp;gt;&lt;br /&gt;
|从字符串s的起始处开始，寻找第一个&amp;#039;&amp;#039;&amp;#039;不&amp;#039;&amp;#039;&amp;#039;出现在strCharSet中的字符，返回其位置索引值。换句话说，返回从字符串s的起始位置的完全由strCharSet中的字符构成的子串的最大长度。strspn为string span的缩写。不支持多字节字符集。&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t   [[strcspn]](const char *s, const char *strCharSet);&amp;lt;/code&amp;gt;&lt;br /&gt;
|从字符串s的起始处开始，寻找第一个出现在strCharSet中的字符，返回其位置索引值。换句话说，返回从字符串s的起始位置的完全由不属于strCharSet中的字符构成的子串的最大长度。strcspn为string complement span的缩写。不支持多字节字符集。&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strpbrk]](const char *s, const char *breakset);&amp;lt;/code&amp;gt;&lt;br /&gt;
|在字符串s中查找breakset中任意字符第一次出现的位置的指针值。strpbrk为string pointer break缩写。通常，breakset是分隔符的集合。不支持多字节字符集。&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strstr]](const char *haystack, const char *needle);&amp;lt;/code&amp;gt;&lt;br /&gt;
|在字符串haystack中查找字符串needle第一次出现的位置，heystack的长度必须长于needle&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strtok]](char *strToken, const char *strDelimit );&amp;lt;/code&amp;gt;&lt;br /&gt;
|将一个字符串strToken依据分界符（delimiter）分隔成一系列字串。此函数非线程安全，且不可重入；但MSVC实现时使用了thread-local static variable因而是线程安全的但仍然是不可重入，即在单线程中不能对两个源字符串交替调用该函数来分析token，应当对一个字符串分析完成后再处理别的字符串。&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t   [[strxfrm]](char *dest, const char *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|根据当前locale转换一个字符串为strcmp使用的内部格式&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===ISO C扩展函数===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 名称 !! 说明 !! 标准&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void    *[[memccpy]](void *dest, const void *src, int c, size_t n&lt;br /&gt;
);&amp;lt;/code&amp;gt;&lt;br /&gt;
|在两块不重叠的内存地址间复制内容，直至复制了n字节或遇到内容为c的字节&lt;br /&gt;
|UNIX 98?&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;void *[[mempcpy]](void *dest, const void *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;memcpy&amp;lt;/code&amp;gt;的变体，返回写入的最后一个字节的地址指针&lt;br /&gt;
|[[GNU]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;errno_t [[strcat_s]](char *s1, size_t s1max, const char *s2);&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;strcat&amp;lt;/code&amp;gt;的变体，带边界检查&lt;br /&gt;
|ISO/IEC WDTR 24731&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;errno_t [[strcpy_s]](char *s1, size_t s1max, const char *s2);&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;的变体，带边界检查&lt;br /&gt;
|ISO/IEC WDTR 24731&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char *[[strdup]](const char *);&amp;lt;/code&amp;gt;&lt;br /&gt;
|将字符串的内容复制到一段新分配的内存空间&lt;br /&gt;
|[[POSIX]]；源于一个BSD扩展标准&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;int     [[strerror_r]](int, char *, size_t);&amp;lt;/code&amp;gt;&lt;br /&gt;
|将strerror()的结果放入一段给定的内存缓冲，此函数是线程安全的&lt;br /&gt;
|POSIX:2001&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char *[[strerror_r]](int, char *, size_t);&amp;lt;/code&amp;gt;&lt;br /&gt;
|使用线程安全的方式返回strerror()的结果。在必要的时候才使用给定的内存缓冲 (与POSIX中的定义不一致).&lt;br /&gt;
|GNU&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t [[strlcat]](char *dest, const char *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;strcat&amp;lt;/code&amp;gt;的变体，带边界检查&lt;br /&gt;
|首先定义于[[OpenBSD]]，现在也可以在[[FreeBSD]]、[[Solaris]]、[[Mac OS X]]中找到&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;size_t [[strlcpy]](char *dest, const char *src, size_t n);&amp;lt;/code&amp;gt;&lt;br /&gt;
|&amp;lt;code&amp;gt;strcpy&amp;lt;/code&amp;gt;的变体，带边界检查&lt;br /&gt;
|首先定义于[[OpenBSD]]，现在也可以在[[FreeBSD]]、[[Solaris]]、[[Mac OS X]]中找到&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strsignal]](int sig);&amp;lt;/code&amp;gt;&lt;br /&gt;
|与&amp;lt;code&amp;gt;strerror&amp;lt;/code&amp;gt;类似，返回[[有符号数]]&amp;lt;code&amp;gt;sig&amp;lt;/code&amp;gt;对应的错误解释字符串（非线程安全函数）&lt;br /&gt;
|BSDs, Solaris, Linux&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char    *[[strtok_r]](char *, const char *, char **);&amp;lt;/code&amp;gt;&lt;br /&gt;
|strtok的线程安全且可重入的版本&lt;br /&gt;
|POSIX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
*[http://linux.die.net/man/3/string Linux库函数手册：字符串操作]{{Wayback|url=http://linux.die.net/man/3/string |date=20101121094443 }}&lt;br /&gt;
&lt;br /&gt;
[[Category:字符串]]&lt;br /&gt;
[[Category:C标准库头文件]]&lt;/div&gt;</summary>
		<author><name>210.71.216.241</name></author>
	</entry>
</feed>