strcpy与strncpy作为复制函数的用法与区别
·
1、strcpy
是 C 语言标准库中的一个函数,用于将一个字符串复制到另一个字符串中。它的原型定义在 <string.h> 头文件中,用法如下:
char *strcpy(char *dest, const char *src); |
dest是指向目标字符串的指针,即复制操作的结果将存储在这里。src是指向源字符串的指针,即要复制的内容。
strcpy 函数会将 src 指向的字符串(包括终止的空字符 \0)复制到 dest 指向的位置。复制完成后,dest 将指向一个新的字符串,该字符串与 src 相同。
需要注意的是,strcpy 不会自动为目标字符串分配内存。因此,在使用 strcpy 之前,必须确保 dest 指向的内存区域足够大,能够容纳源字符串及其终止的空字符。
示例 1:基本用法
#include <stdio.h> |
|
#include <string.h> |
|
int main() { |
|
char src[] = "Hello, World!"; |
|
char dest[50]; // 确保目标数组有足够的空间 |
|
strcpy(dest, src); |
|
printf("Source: %s\n", src); |
|
printf("Destination: %s\n", dest); |
|
return 0; |
|
} |
输出:
Source: Hello, World! |
|
Destination: Hello, World! |
示例 2:复制部分字符串
虽然 strcpy 本身会复制整个字符串,但你可以通过限制目标数组的大小来间接实现部分复制(不过这样做通常不安全,因为 strcpy 不会检查目标数组的大小)。更安全的方法是使用 strncpy。
然而,为了说明 strcpy 的工作原理,这里只展示一个基本的例子,但请注意,这种做法在实际应用中可能会导致缓冲区溢出。
#include <stdio.h> |
|
#include <string.h> |
|
int main() { |
|
char src[] = "Hello, Long String!"; |
|
char dest[10]; // 目标数组空间不足 |
|
// 这将导致缓冲区溢出,因为 src 字符串比 dest 数组长 |
|
strcpy(dest, src); |
|
// 下面的输出可能是未定义的,因为 dest 没有足够的空间来存储完整的 src 字符串 |
|
printf("Destination (unsafe): %s\n", dest); |
|
// 在实际应用中,应该避免这样做,并使用 strncpy 或确保 dest 有足够的空间 |
|
return 0; |
|
} |
注意:上面的代码是不安全的,因为 dest 数组没有足够的空间来存储 src 字符串及其终止的空字符。在实际应用中,应该使用 strncpy 或确保目标数组有足够的空间。
2、strncpy
为了避免缓冲区溢出,可以使用 strncpy 函数,它允许你指定要复制的最大字符数。
#include <stdio.h> |
|
#include <string.h> |
|
int main() { |
|
char src[] = "Hello, Long String!"; |
|
char dest[10]; |
|
strncpy(dest, src, sizeof(dest) - 1); // 复制最多 9 个字符,留出空间给 '\0' |
|
dest[sizeof(dest) - 1] = '\0'; // 确保字符串以 '\0' 结尾(strncpy 可能不会这样做,如果源字符串太长) |
|
printf("Destination (safe): %s\n", dest); |
|
return 0; |
|
} |
输出:
复制代码
Destination (safe): Hello |
在这个例子中,strncpy 只复制了 src 字符串的前 9 个字符到 dest,并手动在末尾添加了空字符 \0 来确保字符串正确终止。
更多推荐


所有评论(0)