C语言:strcpy与strncpy的学习

strcpy函数

strcpy函数的学习

strcpy是 C 标准库中的一个函数,它用于复制字符串。具体来说,strcpy 函数将源字符串(包括 '\0')复制到目标字符串中。

函数原型

<string.h> 头文件中,strcpy 函数的原型如下:

char *strcpy(char *dest, const char *src);

参数

  • dest:指向目标字符串的指针,即复制操作的目标位置。需要注意的是,dest 必须有足够的空间来存储源字符串,包括终止空字符 '\0'
  • src:指向源字符串的指针,即要复制的字符串。

返回值

strcpy 函数返回指向目标字符串 dest 的指针。

功能

strcpy 函数将 src 指向的字符串(包括终止空字符 '\0')复制到 dest 指向的内存位置。这个函数不会检查 dest 是否有足够的空间来存储 src,因此使用时必须确保 dest 有足够的空间,否则可能会导致缓冲区溢出,这是一个严重的安全问题。

示例

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char source[] = "Hello, World!";  
    char destination[50];  
  
    strcpy(destination, source);  
  
    printf("Source: %s\n", source);  
    printf("Destination: %s\n", destination);  
  
    return 0;  
}

安全注意事项

由于 strcpy 不会自动检查目标缓冲区的大小,如果源字符串的长度超过了目标缓冲区的大小,就会发生缓冲区溢出,可能导致程序崩溃或者更严重的安全问题。

模拟实现strcpy函数

参考代码

#include <stdio.h>  
  
// 自定义的 strcpy 函数  
char* my_strcpy(char* dest, const char* src) {  
    char* original_dest = dest;  
  
    // 循环,直到遇到 src 的 '\0' 字符  
    while (*src != '\0') {  
        // 将 src 的字符逐个复制到 dest  
        *dest = *src;  
        // 移动到下一个字符  
        dest++;  
        src++;  
    }  
  
    // 添加终止字符 '\0' 到 dest 的末尾  
    *dest = '\0';  
  
    // 返回原始的 dest 指针  
    return original_dest;  
}  
  
int main() {  
    char source[] = "Hello, World!";  
    char destination[50];  
  
    my_strcpy(destination, source);  
  
    printf("Source: %s\n", source);  
    printf("Destination: %s\n", destination);  
  
    return 0;  
}

代码优化

#include <stdio.h>
#include <assert.h>

// 自定义的 strcpy 函数
char *my_strcpy(char *dest, const char *src) {
    char *original_dest = dest;
    assert(dest && src);//确保指针不为空
    while (*dest++ = *src++) { ;
    }
    // 返回原始的 dest 指针
    return original_dest;
}

int main() {
    char source[] = "Hello, World!";
    char destination[50];

    my_strcpy(destination, source);

    printf("Source: %s\n", source);
    printf("Destination: %s\n", destination);

    return 0;
}

strncpy函数的学习

strncpy 是 C 标准库中的另一个字符串操作函数,与strcpy 类似,但提供了更多的安全性。strncpy 的主要特点是它允许指定一个最大字符复制数量,从而防止因目标缓冲区过小而导致的缓冲区溢出。

函数原型

strncpy 函数的原型通常定义在 <string.h> 头文件中,如下所示:

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

参数

  • dest:指向目标字符串的指针,即复制操作的目标位置。
  • src:指向源字符串的指针,即要复制的字符串。
  • n:要复制的最大字符数。

返回值

strncpy 函数返回指向目标字符串 dest 的指针。

功能

strncpy 函数从 src 指向的字符串中复制最多 n 个字符到 dest 指向的内存位置。如果 src 的长度小于 n,则 dest 的剩余部分将用 '\0' 填充,但不会自动在 dest 后添加 '\0' 字符。因此,在使用 strncpy 后,通常需要手动在 dest 的适当位置添加一个 '\0' 字符,以确保它是一个以空字符结尾的合法 C 字符串。

示例

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char source[] = "Hello, World!";  
    char destination[20];  
  
    strncpy(destination, source, 10); // 复制最多10个字符  
    destination[10] = '\0'; // 手动添加字符串结束符  
  
    printf("Source: %s\n", source);  
    printf("Destination: %s\n", destination);  
  
    return 0;  
}

安全注意事项

虽然 strncpystrcpy 更安全,因为它限制了复制的字符数量,但仍然需要谨慎使用。特别是,需要确保在复制后手动添加'\0'字符,并且要注意不要截断字符串或覆盖目标缓冲区的边界。

strncpy 函数的模拟实现

参考代码

#include <stdio.h>  
  
char* my_strncpy(char* dest, const char* src, size_t n) {  
    size_t i;  
  
    // 复制字符串,直到达到指定的字符数n或者遇到src的结尾  
    for (i = 0; i < n && src[i] != '\0'; i++) {  
        dest[i] = src[i];  
    }  
    return dest;  
}  
  
int main() {  
    char source[] = "Hello, World!";  
    char destination[20];  
  
    my_strncpy(destination, source, 10);  
  
    printf("Source: %s\n", source);  
    printf("Destination: %s\n", destination);  
  
    return 0;  
}

注意:以上模拟的函数需要在best后面添加'\0.

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值