strcpy_s的用法
{
char str[10], str1[9];
for(int i=0; i<9;i++)
{
str1[i] ='a';
}
strcpy_s(str, sizeof(str), str1);
cout<<str<<endl;
}
上述代码运行时异常。为什么会出现异常?
这是异常报告。
请问出现异常的原因是什么? 展开
strcpy,即string copy(字符串复制)的缩写。strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
返回strDest的原始值使函数能够支持链式表达式,增加了函数的“附加值”。同样功能的函数,如果能合理地提高的可用性,自然就更加理想。
返回strSrc的原始值是错误的。其一,源字符串肯定是已知的,返回它没有意义。其二,不能支持形如第二例的表达式。其三,为了保护源字符串,形参用const限定strSrc所指的内容,把const char *作为char *返回,类型不符,编译报错。
扩展资料
将问题通过功能分解,各个击破的编程方法(过程化编程) 是一种以行为抽象为主的抽象编程将问题通过实体分析,分层分类地实现抽象数据类型,从而进行简单应用编程(基于对象编程)是一种以数据抽象为主的抽象编程
这种抽象编程,通过数据类型复用,方便编程,方便维护和扩展,其效果比过程化编程更好编程语言中没有许多具体的数据类型要解决实际问题,很大部分工作是要建立数据模式与实际问题的对应,也就是建立抽象数据类型的过程对象化编程就是基于分层分类的抽象数据类型之具体编程。
参考资料来源:百度百科-strcpy
strcpy是把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。可以把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。
例:
已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc);
1、不调用库函数,实现strcpy函数。
2、解释为什么要返回char *。
扩展资料:
错误的做法:
1、不检查指针的有效性,说明答题者不注重代码的健壮性。
2、检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。
char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
3、检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。
0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
参考资料来源:百度百科-strcpy
代码中的str1[9]的9个数组成员都被赋值为'a',没有结束符'\0',因此strcpy_s在复制完str1的9个字符后还在继续赋值其后的内存,并且最终复制的字符数大于了目标缓冲区的长度10,因此引发此断言失败。
{
int i;
char str[10], str1[9];
for(i=0; i<9;i++)
{
str1[i] ='a';
}
str1[i-1]='\0';
strcpy_s(str, sizeof(str), str1);
cout<<str<<endl;
}