/*********************************************
* @brief 复制字符串
* @param dest 目标地址
* @param src 源字符串
* @return 目标地址
********************************************/
char* strcpy(char* restrict dest, const char* restrict src);
!subtitle:说明
将 src 指向的字符串复制到 dest 指向的内存。
注意:
dest 必须有足够的空间
dest 和 src 指向的字符串不可以存在重叠
!subtitle:参数
dest - 指向要复制到的内存地址
src - 指向要被复制的字符串
!subtitle:返回值
返回目标地址 dest 本身
#include <stdio.h>
#include <string.h>
int main(void)
{
char dest[10];
strcpy(dest, "hello");
printf("%s\n", dest);
return 0;
}
说明:
将 "hello" 复制到 dest,包含结尾的 0
运行结果:
hello
Never gon
通过 strcpy 进行字符串复制时,dest 和 src 指向的内存不能重叠,否则可能产生错误。例如:
char array[10] = "abcde";
strcpy(array + 1, array); // 复制
期望结果是 "aabcde",而实际结果可能是 "aaaaaa",因为会这样复制:
flowchart TD
subgraph A["开始"]
a ~~~ b ~~~ c ~~~ d ~~~ e ~~~ f
style f stroke:none,fill:transparent,color:transparent
end
subgraph B["array[0] 复制到 array[1]"]
B1[a] ~~~ B2[a] ~~~ B3[b] ~~~ B4[c] ~~~ B5[d] ~~~ B6
B1 --> B2
style B6 stroke:none,fill:transparent,color:transparent
end
subgraph C["array[1] 复制到 array[2]"]
C1[a] ~~~ C2[a] ~~~ C3[a] ~~~ C4[c] ~~~ C5[d] ~~~ C6
C2 --> C3
style C6 stroke:none,fill:transparent,color:transparent
end
subgraph D["array[2] 复制到 array[3]"]
D1[a] ~~~ D2[a] ~~~ D3[a] ~~~ D4[a] ~~~ D5[d] ~~~ D6
D3 --> D4
style D6 stroke:none,fill:transparent,color:transparent
end
subgraph E["array[3] 复制到 array[4]"]
E1[a] ~~~ E2[a] ~~~ E3[a] ~~~ E4[a] ~~~ E5[a] ~~~ E6
E4 --> E5
style E6 stroke:none,fill:transparent,color:transparent
end
subgraph F["array[4] 复制到 array[5]"]
F1[a] ~~~ F2[a] ~~~ F3[a] ~~~ F4[a] ~~~ F5[a] ~~~ F6[a]
F5 --> F6
end
A --> B --> C --> D --> E --> F
classDef SUB fill:#212121,color:#fefefe,stroke:#e91e63
class A SUB
class B SUB
class C SUB
class D SUB
class E SUB
class F SUB
如果要进行这样的重叠复制,请使用 memmove 函数。
编译器可能会在
strcpy进行重叠复制时纠正该问题,导致上述错误无法复现。
C23 standard (ISO/IEC 9899:2024):
7.24.2.3 The strcpy function (p: TBD)
C17 standard (ISO/IEC 9899:2018):
7.24.2.3 The strcpy function (p: 264-265)
C11 standard (ISO/IEC 9899:2011):
7.24.2.3 The strcpy function (p: 363)
C99 standard (ISO/IEC 9899:1999):
7.21.2.3 The strcpy function (p: 326)
C89/C90 standard (ISO/IEC 9899:1990):
4.11.2.3 The strcpy function