strcpy与strncpy的区别

这篇具有很好参考价值的文章主要介绍了strcpy与strncpy的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


1.strcpy的隐患:
  • strcpy(char *to,const char *from);
  • 该函数判断’\0’作为结束条件,如果目标字符串to的 空间不足 ,则会 发生溢出 。这是一个潜在的安全隐患,随时有可能会出现错误。

2.strncopy的安全性:

  • strncpy(char *to,const char *from,int size);
  • strncpy通过size来控制复制的结束,这个size是要从源字符串from的大小(size <= sizeof(to)-1),这便保证了字符复制的安全性。这是一种强制性的安全措施,同样它有似乎不可避免的会产生下面的问题:
    • 1.strncpy不能保证目标字符串to以’\0’结尾。
      这种情况发生在源字符串from长度大于目标字符串to的长度。
    • 2.源字符串from较小,而目标字符串to较大,将会用大量’\0’填充剩余的空间。
   另一本版, size =sizeof(to)-1,感觉这一解释更合理

1 C 库函数 - strcpy()

C 标准库 - <string.h>

描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。

需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。

声明
下面是 strcpy() 函数的声明。
char *strcpy(char *dest, const char *src)

参数
dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。

返回值
该函数返回一个指向最终的目标字符串 dest 的指针。

实例
下面的实例演示了 strcpy() 函数的用法。

实例 1
#include <stdio.h>
#include <string.h>
 
int main()
{
   char src[40];
   char dest[100];
  
   memset(dest, '\0', sizeof(dest));//使用函数 memset() 来清除内存位置。
   strcpy(src, "This is runoob.com");
   strcpy(dest, src);
 
   printf("最终的目标字符串: %s\n", dest);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

最终的目标字符串: This is runoob.com

实例 2
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
strcpy与strncpy的区别

实例 3

#include <stdio.h>
#include <string.h>
 
int main ()
{
  char str1[]="Sample string";
  char str2[40];
  char str3[40];
  strcpy (str2,str1);
  strcpy (str3,"copy successful");
  printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
  return 0;
}

让我们编译并运行上面的程序,这将产生以下结果:

str1: Sample string
str2: Sample string
str3: copy successful

2 C 库函数 - strncpy() (字符串限长复制)

C 标准库 - <string.h>
描述
C 库函数 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。

参数
dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
n – 要从源中复制的字符数。

返回值
该函数返回最终复制的字符串。

实例
下面的实例演示了 strncpy() 函数的用法。在这里,我们使用函数 memset() 来清除内存位置。

#include <stdio.h>
#include <string.h>
 
int main()
{
   char src[40];
   char dest[12];
  
   memset(dest, '\0', sizeof(dest));//使用函数 memset() 来清除内存位置。
   strcpy(src, "This is runoob.com");
   strncpy(dest, src, 10);
 
   printf("最终的目标字符串: %s\n", dest);
   
   return(0);
}

让我们编译并运行上面的程序,这将产生以下结果:

最终的目标字符串: This is ru

3 strcpy(str, p)

char str[4] = { 0 };
char* p = "abc";
strcpy(str, p);
printf("%s\n",str);

strcpy与strncpy的区别

如果,str的空间 小于 p指向的串;
虽然拷贝过来了,但程序崩溃

    char str[4] = { 0 };
	char* p = "abcefgh";
	strcpy(str, p);

strcpy与strncpy的区别

4 strncpy(str, p, sizeof(str) - 1)

函数原型:char *strncpy(char *dest, char *src, size_t num);

	char str[4] = { 0 };
	char* p = "abcefgh";
	strncpy(str,p,sizeof(str)-1);

当改用strncpy()后,指定了拷贝长度为 str空间 - 1 ,减1是因为str最后一个空间存储的是结束符 ‘\0’
strcpy与strncpy的区别

strncpy遇到’\0’就结束了,不会在拷贝’\0’后面的字符;
而strcpy会在拷贝’\0’;

下面例子 在p串中加入 ‘\0’,
strncpy并没有拷贝串后的\0字符。
两者都不能越界拷贝。只要正确使用strncpy, 那就比strcpy安全。

	char str[4] = { 0 };
	char* p = "a\0bcefgh";
	strncpy(str,p,sizeof(str)-1);

strcpy与strncpy的区别

strcpy与strncpy的区别

strnpy拷贝的是字符串,会拷贝最后一个\0;
strncpy拷贝的是字符,不拷贝串,所以最后一个\0没有拷贝;

	char str[4] = { 0 };
	str[3] = 'w'; //故意将最后的\0换成w
	char* p = "abc";
	strcpy(str, p);//虽然字符串str最后一个位置的结束符被置为'w',但在拷贝p时,拷贝了"abc",还拷贝了最后一个结束符'/0'

strcpy与strncpy的区别

  char str[4] = "xyz";
	str[3] = 'w'; //故意将最后的\0换成w
	char* p = "abc";
	//strcpy(str, p);
	strncpy(str,p,sizeof(str)-1);
	//strncpy拷贝的是字符,最后一个\0没有拷贝;str[3]的位置是'w',而不是结束符

strcpy与strncpy的区别文章来源地址https://www.toymoban.com/news/detail-444715.html

到了这里,关于strcpy与strncpy的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言strncpy,strncat,strncmp函数详解

    strncpy函数是一个C标准库函数,使用时应包含头文件#includestring.h;strncpy函数功能与strcpy函数相同,用于将一个字符串复制到另一个字符串,但strncpy函数不同与strcpy函数的是,strncpy可以指定复制的字符数量。 strncpy函数原型:char *strncpy(char *dest, const char *src, size_t n); 参数说明:

    2024年02月04日
    浏览(33)
  • C++面试八股文:如何实现一个strncpy函数?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官: strcpy 函数使用过吧? 二师兄:用过。 面试官:这个函数有什么作用? 二师兄:主要用做字符串复制,将于字符从一个位置复制到另一个位置。 面试官: strncpy 函数也使用过吧,和 strcpy 有何不同? 二师兄:

    2024年02月11日
    浏览(44)
  • 【C语言】strcpy函数的超细节详解(什么是strcpy,如何模拟实现strcpy?)

    目录 一、观察strcpy()库函数的功能与实现  二、模仿实现strcpy()函数  🔍优化代码  🔍assert断言拦截  🔍const修饰常量指针  🔍返回值的加入 三、共勉 首先我们先来观察一下库函数 strcpy 去实现字符串拷贝的功能 清楚了这个库函数的功能之后,我们在来详细的解析一下:

    2024年04月08日
    浏览(36)
  • C语言-函数STRCPY

    char *strcpy(char *restrict dst, const char *restrict src); 把src的字符串拷贝到dst restrict表明src和dst不重叠(C99) 返回dst 为了能链起代码来 char dst = (char )malloc(strlen(src) + 1); strcpy(dst, src);

    2024年02月04日
    浏览(41)
  • 【C语言】strcpy()函数

    文章目录 一、strcpy()函数的简介 二、strcpy()函数的具体使用 三、使用strcpy()函数的注意事项  strcpy()函数:是将一个字符串复制到另一块空间地址中 的函数,‘\\0’是停止拷贝的终止条件,同时也会将 \\\'\\0\\\' 也复制到目标空间。下面是库中的strcpy()函数声明: char* strcpy(char* des

    2024年02月03日
    浏览(30)
  • C语言的strcpy()函数

    strcpy()函数的简介 strcpy()函数用于将一个字符串拷贝到另一个内存地址的函数,拷贝停止的条件是遇到\\\'\\0\\\',同时会将\\\'\\0\\\'一同拷贝到目标地址。下面是strcpy()函数的声明: 1. 函数的参数: char* destination---------目标字符串的首地址 const char* source------源地址:被复制的字符串的首

    2024年02月13日
    浏览(31)
  • 【C语言】strcpy()函数(字符串拷贝函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.strcpy()函数简介 1.函数功能 2.函数参数 1.char * destination 2.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用strcpy()函数完成字符数组间的字符拷贝 2.使用strcpy()函数完成

    2024年02月03日
    浏览(34)
  • C语言--strcmp函数,strcat函数,strcpy函数详解及实现

    目录 1.strcmp函数 1.1函数介绍 1.2函数使用 1.2.1代码 1.2.2运行结果 1.3模拟实现strcmp 1.3.1实现思路 1.3.2代码  1.3.3运行结果 2.strcat函数 2.1函数介绍 2.2函数使用  2.2.1代码 2.2.2运行结果 2.3模拟实现strcat 2.3.1实现思路 2.3.2代码  2.3.3运行结果 3.strcpy函数 3.1函数介绍 3.2函数使用 3.2.1代

    2024年02月01日
    浏览(67)
  • C语言--模拟实现库函数strcpy

    本章内容我们将通过相关函数来实现库函数中的strcpy。 C语言 strcpy()函数用于对字符串进行复制(拷贝)。需要的头文件为 string.h 。原理如下 其中的strSource为 源字符串 ,strDestination为 目的字符串 ,strcpy的作用就是将 strSource 指向的字符串复制到 strDestination。 我们举个例子 打

    2024年01月19日
    浏览(30)
  • 模拟strcpy库函数的实现(超详细)

    ⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言初阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记 点赞收藏+关

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包