2016年的C++常见的面试问题详解~搬至牛客网~strcpy

来源:互联网 发布:汇通天下g7怎么样知乎 编辑:程序博客网 时间:2024/06/05 20:46

关于Strcpy的复制的使用在C/C++,以及strcpy的实现分析

分为3个问题为一组,可以方面记忆;

资料来源:http://www.nowcoder.com/ta/review-c/review?query=&asc=true&order=&page=5

问题1:

void test1()

{
 char string[10];
 char* str1 = "0123456789";
 strcpy( string, str1 );

}

在str1上面实际是隐含有“\n”,所以说str1的字节数目是11;而string[10]是10个字节数目所以会发生数组越界


问题2:
void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
 str1  = 'a';
 }
strcpy( string, str1 );
}

(1)str1是指针表示:str1的第一个元素的地址不可以进行复制;可以改为 *str1 = 'a';

(2)strcpy的copy结束的标志是'\0',所以如果没有表示位结束就会可能发生越界访问非法内存,是程序崩溃。


修改如下:

void test2()
{
 char string[10], str1[10];
 int i;
 for(i=0; i<10; i++)
 {
      str1[i]  = 'a';
 }

      str1[9] = '\0';//增加结束的标志,防止越界访问非法内存。

strcpy( string, str1 );
}


问题3:

void test3(char* str1)
{
 if(str1 == NULL){
        return ;
 }
 char string[10];
 if( strlen( str1 ) <= 10 )

 strcpy( string, str1 );
 }
}

strlen(str1) <= 10在长度等于10的时候我们知道有隐含的'\0'这是字节长度是11为,而string[10]长度是10,所以会产生数组越界


后面附上strcpy的相关知识:

//关于C的strcpy的代码编写
/*
 *(1)在strcpy中的参数的形式是const char *的类型:
 const是C++中进行安全检查的可以进行修饰数据类型,const修饰的是常量不可以进行修改
 
 *(2)对strDest&strSrc指针进行有效性检查,并且有NULL进行隐式转换,最后经过throw
 抛出在内存问题过程中的内存泄露
 
 *(3)保存在复制的地址进行相应的复制保存,这样可以增加逻辑严密性
 
 *(4)(*strDest++ = *strSrc ++)!='\0'是对于在复制过程中的边界检查,在字符的后
 面通常隐藏'\0'结尾
 *
 *源网址解析:网址http://bbs.csdn.net/topics/310267898
 */


char *strcpy(char *strDest, const char *strSrc){
    
    if((strDest == NULL)||(strSrc == NULL))
        throw "Invalid argument(s)";
    
    char *strDestCopy = strDest;
    
    while ((*strDest++ = *strSrc ++)!='\0');
    
    return strDestCopy;
}



0 0