strcpy()函数用法及其详解
strcpy()
和strcat()
函数都有相同的问题,他们都不能检验目标空间是否能够容纳源字符串的副本。
所以,拷贝字符串用strncpy()
函数更加安全
描述:
C 库函数 char *strncpy(char *dest, const char *src, size_t n)
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
声明:
char *strncpy(char *dest, const char *src, size_t n)
参数:
dest
– 指向用于存储复制内容的目标数组。src
– 要复制的字符串。n
– 要从源中复制的字符数。
返回值:
该函数返回最终复制的字符串。
案例:该程序用strncpy()
代替strcpy()
,为了演示目标空间装不下源字符串的副本会发生什么情况,该程序使用了一个相当小的目标字符串(共七个元素,包含6个字符)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 40
#define TARGSIZE 7
#define LIM 5
char * s_gets(char *str,int n);//处理非法输入
int main()
{
char qwords[LIM][TARGSIZE];
char temp[SIZE];
int i = 0;
printf("Enter %d words beginning with q:\n",LIM);
while(i<LIM&&s_gets(temp,SIZE))
{
if(temp[0]!='q')
{
printf("%s doesn't beginning with q.\n",temp);
}
else
{
strncpy(qwords[i],temp,TARGSIZE-1);
/*
因为不知道输入的有多大,所以保险起见
我们拷贝的字符数减1,剩下一个赋值为空字符
*/
qwords[i][TARGSIZE-1] = '\0';//末尾元素赋值为空
i++;
}
}
printf("Here are the words accepted:\n");
for(int i = 0;i<LIM;i++)
{
puts(qwords[i]);
}
getchar();
return 0;
}
char * s_gets(char *str,int n)//处理非法输入
{
char *rev;
int i = 0;
rev = fgets(str,SIZE,stdin);
if(rev)
{
while(str[i]!='\0'&&str[i]!='\n')
{
i++;
}
if(str[i]=='\n')//输入过短肯定有换行符,消除换行符
{
str[i] = '\0';
}
else
{
while(getchar()!='\n')
{
continue;
}
}
}
return rev;
}
下面是该程序的运行示例:
Enter 5 words beginning with q:
quack
quadratic
quisling
quota
quagga
Here are the words accepted:
quack
quadra
quisli
quota
quagga
strncpy(target,source,n)
把source
中的n个字符或空字符之前的字符(先满足哪个条件就拷贝到何处)拷贝到target
中。因此,如果source
中的字符数小于n
,则拷贝整个字符串,包括空字符。但是,strncpy()
拷贝字符串的长度不会超过n
,如果拷贝到第n
个字符时还未拷贝完整个源字符串,就不会拷贝空字符。所以,拷贝的副本中不一定有空字符。鉴于此,该程序把n
设置为比目标数组大小少1(TARGSIZE-1)
,然后把数组最后一个元素设置为空字符。
strncpy(qwords[i],temp,TARGSIZE-1);
qwords[i][TARGSIZE-1] = '\0';
这样确保存储的是一个字符串。如果目标空间能够容纳字符串的副本,那么从源字符串拷贝的字符便是该副本的结尾;如果目标的空间装不下副本,则把副本最后一个元素设置为空字符。
分类:
C++/C
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2018-09-13 CodeLite C/C+ IDE更新放出
2018-09-13 Easyloggingpp的使用
2018-09-13 Lzma(7-zip)和zlib
2018-09-13 Windump教程-参数介绍