不知道什么时候的面试题,面试嵌入式软件工程师的题目
下面C++的代码可能有问题,因为字符串是以’\0’结尾的,最下面的C是对的,思想都是一样的。
一、问题描述
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
二、问题求解
(1)代码
#include
#include
using namespace std;
char *strcpy(char *strDest, const char *strSrc)
{
if((strDest==NULL) || (strSrc==NULL))
{
return NULL;
}
char *address=strDest;
while((*strDest++ = *strSrc++) != '0')
{
NULL;
}
return address;
}
int main()
{
char *strSrc="abc";
char *strDest=new char[20];
cout<<strSrc<<endl;
strDest = strcpy(strDest, strSrc);
cout<<strDest<<endl;
return 0;
}
char* strcpy(char* strDest, const char* strSrc)
{
ASSERT(strDest != NULL && strSrc != NULL);
char* strTmpD = strDest;
while ((*strTmpD++ = *strSrc++) != '0')
{
}
return strDest ;
}
void* memcpy(void* pDest, const void* pSrc, unsigned int size)
{
ASSERT(pDest != NULL && pSrc != NULL);
byte* pTmpD = (byte*)pDest;
byte* pTmpS = (byte*)pSrc;
while (size-- >0)
{
*pTmpD++ = * pTmpS++;
}
return pDest;
}
#include
char* strcpy(char *strDest, const char* strSrc)
{
char *p=NULL;
if(strDest == NULL || strSrc == NULL)
{
return NULL;
}
p = strDest;
while((*strDest++ = *strSrc ++) != '\0');
return p;
}
int getStrLen(const char* str)
{
int len = 0;
while( *str ++ != '\0')
{
len ++;
}
return len;
}
(2)答:为了实现链式表达式。
例如 int length = strlen( strcpy( strDest, “hello world”) );
(1).strcpy只能用于字符串拷贝;而memcpy是内存拷贝,可以拷贝任何类型的数据。
(2).当二者都进行字符串拷贝时,strcpy遇到字符串结尾’/0’即完成;而memcpy只是内存的原样拷贝,不管遇到什么。
memcpy() – 拷贝内存内容
相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy()
表头文件: #include
定义函数: void *memcpy(void *dest, const void *src, size_t n)
函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束’/0’而结束
返回值: 返回指向dest的指针
附加说明: 指针src和dest所指的内存区域不可重叠