再学C语言51:C库中的字符串函数(3)

文章介绍了C语言中的strcpy()和strncpy()函数,用于字符串复制。strcpy()函数直接复制整个字符串,但不检查目标字符串的大小,可能存在溢出风险。strncpy()函数增加了复制字符的数量限制,提高了安全性,但需要注意正确处理空字符。示例代码展示了如何使用这两个函数,并解释了它们的工作原理和潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、strcpy()函数

功能:复制字符串,在字符串中的作用等价于赋值运算符

示例代码:

/* test of strcpy() function */
#include <stdio.h>
#include <string.h>

int main(void)
{
    char arr1[] = "Easy doesn't enter into grow-up life.";
    char arr2[100] = "initial string";

    puts(arr2);

    strcpy(arr2, arr1);

    puts(arr1);
    puts(arr2);
}

运行结果:

1408cdc49648484cb8d36ec1d1240f84.png

strcpy()接受两个字符串指针参数:指向最初字符串的第二个指针可以是一个已经声明的指针、数组名或字符串常量;指向复制字符串的第一个指针应指向空间大到足够容纳该字符串的数据对象,比如一个数组

声明一个数组将为数组分配存储空间;而声明一个指针只为一个地址分配存储空间

1)strcpy()函数是char *类型,返回的是第一个参数的值,即一个字符的地址

2)第一个参数不需要指向数组的开始,可以只复制数组的一部分

示例代码:

/* another test of strcpy() function */
#include <stdio.h>
#include <string.h>

int main(void)
{
    char arr1[] = "Easy doesn't enter into grow-up life.";
    char arr2[100] = "Morning! ";

    puts(arr2);

    strcpy(arr2 + 9, arr1);

    puts(arr1);
    puts(arr2);
}

运行结果:

6bd9bef9d8af4681b91133a9e9120851.png

二、strncpy()函数

strcpy()函数和gets()函数一样,都不检查目标字符串是否容纳得下源字符串

因此使用strncpy()函数比strcpy()函数安全

strncpy()函数需要第三个参数指明最大可复制的字符数

功能:strncpy(target, source, n)函数,把第二个参数(source)的数组中的n个字符(或空字符之前的字符,由二者中最先满足的那个决定何时终止)复制到第一个参数(target)的数组中

示例代码:

/* another test of strcpy() function */
#include <stdio.h>
#include <string.h>

int main(void)
{
    char arr1[] = "Easy doesn't enter into grow-up life.";
    char arr2[100] = "Morning! ";

    puts(arr2);

    strncpy(arr2 + 9, arr1, 10);

    puts(arr1);
    puts(arr2);
}

运行结果:

f0547a757d38451fab95d5f561a284d7.png

如果源字符串的字符比n小,整个字符串都会被复制过来,包括空字符;如果原字符串还没结束就达到了限制,就不会添加空字符,导致最终的字符串可能没有空字符

因此程序设置的n比目标数组的大小要少1,这样就可以把空字符放到数组的最后一个元素中

strncpy(arr2, arr1, 10 - 1);
arr1[9] = '\0';

这样就保证存储的是一个字符串

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forster-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值