char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL)); // 2分
char *address = strDest; // 2分
while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分
NULL ;
return address ; // 2分
}
恰好昨天在CSDN上看到一个帖子讨论strcpy();
对其中相关的内容做了一点解释:
void test1()
{
int i;
char string[10];
char *str1="0123456789";
strcpy(string, str1); // 字符越界?
/*
错误:
strcpy(desc,src),
当src<=desc时, 如 char *str1="012345678",长度为10,
则string得到合理值,并且string[9]='\0';
当src>desc时,如 char *str1="0123456789",长度为11,
则string得到0-9的值,string[9]='9',
虽然可以运行,但string[9]后面的一个不属于string的字符
被恶意修改为‘\0',这不是我们想要的,也可能造成严重后果。
*/
printf("%s\n",string);
for(i=0;i<11;i++)//故意循环11次,查看最后一个被无意修改的字节;
{
printf("%c\t%d\n",string[i],string[i]);
}
printf("\n");
}
void test2()
{
int i;
char string[100], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
/*
strcpy(desc,src)
会把src 视为string类型,拷贝时查找'\0'结束符,作为scr的结束,来付给desc;
所以,本程序虽然能够运行,但潜在的问题:
str1的所有10个元素被初始化为'a',但后续的字符是不可预料的,
直到”偶然“碰到了'\0',才停止识别str1;
如果string是个100个元素的大数组,则会发现str1后面的"随机元素"也被复制给了string
直到碰到'\0'
说"偶然",加引号,其实'\0'在未知内存中还是挺多的。呵呵
当然,如果desc是string[10]的话,也就会掐掉str1后面的东东,这就是表面上的运行正确;
*/
printf("%s\n",string);
for(i=0;i<100;i++)
{
printf("%c\t%d\t%c\n",string[i],string[i],str1[i]);//对比来看;
}
printf("\n");
}
也就是说,如果str1没有'\0'来表示结束,则,strcpy不能成功执行.
memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。
与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束
memcpy()的实现
难点:1.指针类型的变换
2.要防止内存拷贝时的相互覆盖
#include <iostream>
#include "assert.h"
using namespace std;
{
assert((dest!=NULL)&&(source!=NULL)); //断言
if(dest < source)
{
char* cdest = (char*)dest;
const char* csource = (char*)source;
for(int i=0;i<lengh;i++)
*cdest++ = *csource++;
return cdest;
}
else
{
char* cdest = (char*)(dest)+lengh-1;
char* csource = (char*)(source)+lengh-1;
for(int i=0;i<lengh;i++)
*cdest-- = *csource--;
return cdest;
}
}
int main()
{
char* a = "he\0llo";
char b[10];
memcpy(b,a,10);
for(int k=0;k<6;k++)
cout << b[k] <<endl;
return 0;
}
输出:
h
e
l
l
o
=======================================
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 840我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 966第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 575第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1065一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1417解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 723/****************************** ... -
堆排序
2012-08-16 14:24 888堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 836#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 750一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1709用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1154int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 804顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1030话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 892KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9785两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 1002算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 982假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 776很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1298题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7321、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
本文将深入解析五个常用的C语言函数:`strcpy`、`memcpy`、`memmove`、`strcat`和`strcmp`的实现原理与功能特性,这些函数在处理字符串复制、连接、比较以及内存拷贝时扮演着关键角色。 ### 1. `strcpy` - 字符串...
其中,strcpy和memcpy是两个常用的函数,虽然它们都用于复制内存中的数据,但它们的功能、使用场景以及操作方式有着明显的区别。 首先,strcpy函数是C标准库中的一个字符串处理函数,其原型为`char *strcpy(char *...
在C语言和C++中,`strcpy`和`memcpy`都是用于复制内存区域的函数,但它们在使用场景和操作方式上存在显著的区别。这里我们将深入探讨这两个函数的工作原理、适用情况以及潜在的安全隐患。 首先,`strcpy`是C标准库...
C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识。 1、strcpy和strncpy函数 这个不陌生,大一学...
深入理解`strcpy`与`memcpy`的区别是C语言编程中非常关键的一个知识点,尤其是在处理内存复制操作时。这两个函数都是C标准库中的成员,但它们的功能和使用场景有所差异。 `strcpy`函数专用于字符串复制。它的原型为...
网上参考资料写的memcpy以及strcpy的源码,希望能帮助大家。
memcpy 和 strcpy 的区别 memcpy 和 strcpy 都是标准 C 库函数,都是用于从一块内存复制一段连续的数据到另一块内存,但是它们之间存在一些关键的区别。 首先,strcpy 函数用于复制字符串,它从源字符串的起始地址...
传统的C语言函数如`strcpy`, `strncpy`, `sprintf`, 和 `memcpy`虽然功能强大,但它们缺乏对缓冲区溢出的安全检查,这可能导致严重的安全漏洞。为了解决这个问题,C标准库引入了安全版本的这些函数,例如`strcpy_s`,...
本文将详细解析strcpy、sprintf、memcpy这三个函数的区别,以及sizeof和strlen这两个操作的区别。 首先,strcpy是一个专门用于字符串拷贝的函数,它从源字符串复制内容到目标字符串,直到遇到终止符'\0'为止。例如...
因此,`memcpy`在处理非字符串数据或者已知大小的内存块时非常有用,但同样需要注意避免源和目标缓冲区的重叠,以及确保目标缓冲区有足够的空间。 在实际编程中,为了确保安全,应谨慎使用`strcpy`,优先考虑使用`...
memset,memcpy,strcpy 的用法,详细区别还有优缺点对比!
Strcpy用于字符串拷贝,重点在于字符串的复制以及包含字符串结束符'\0'。正确使用这三个函数,需要根据实际的应用场景和要求来选择合适的函数进行内存操作。在涉及到安全性和效率的场合,比如嵌入式系统编程或单片机...
本文将重点解析`strcpy`函数的功能、实现方式及其潜在问题,并通过具体的代码示例来加深理解。 #### strcpy简介 `strcpy`函数的主要作用是从源字符串复制内容到目标字符串。其原型定义通常如下: ```c char *...
本文将深入探讨`strcpy`、`sprintf`、`memcpy`这三种函数的区别以及`sizeof`和`strlen`的区别与联系。 首先,让我们来看`strcpy`、`sprintf`和`memcpy`的区别。这三个函数都是用于数据的复制,但它们的使用场景和...
在C++编程中,`memset`, `memcpy`, 和 `strcpy` 是三个经常使用的函数,用于处理内存区域的数据操作。它们各自有不同的用途和特点,本文将深入解析它们的区别。 `memset` 函数是用来设置一块内存区域的值。其原型为...
void memsetEX(unsigned char *dst,unsigned char val,unsigned char len); void memcpyEX(unsigned char *dst,unsigned char *src,unsigned char len); unsigned char memcmpEX(unsigned char *dst,unsigned char...
strcpy、memcpy、memmove 和 memset 四个函数都是用于字符串和内存操作的,但是它们之间有一些区别: * strcpy 函数用于字符串拷贝,但是它不知道拷贝的字节数目,它会一直拷贝直到遇到字符串结束符 '\0'。 * ...
下面我们将详细探讨`memcpy`函数的使用、特点以及与其他函数的比较。 ### 函数原型 `memcpy`函数的原型定义如下: ```c void *memcpy(void *dest, const void *src, size_t n); ``` 参数解释如下: 1. `dest`:...