strcpy

做C++试题时无意中看到此题,因起一振思想风暴!且看:

 

int main() {

       char p1[ 10 ], p2[ 10 ];

       strcpy( p1, "abc" );

       strcpy( p2, "ABC" );

       char str[ 50 ] = "xyz";

       strcpy( str + 2, strcat( p1, p2 ) );

       cout << str << endl;

       return 0;

}

输出为: xyabcABC

对于strcpy()来说,大家并不陌生,无非是把第二个参数的内容复制进第一个参数里嘛。但能否正确并恰如其分地运用好它,这也是得仔细琢磨的。

其原形:char* strcpy( char *to, const char *from );

首先看看使用strcpy()时错误的例子:

错甲:

int main() {

       char first_name[ 100 ] = "Stone Cold ";

       char last_name[ 50 ] = "Steve Austin";

       strcpy( first_name , last_name );

       cout << first_name << endl;

       return 0;

}

错!因为从函数原形的参数表里面儿,我们已经看到:第一个参数是 to,也就是说从from来的数据将会直接流至并占有to的地盘,覆盖掉to内的数据!如例所示,这么一来,输出将会是:Steve Austin,而原来的Stone Cold就被覆盖掉了。悲剧!Tragedy !

 

错乙:

int main() {

       char first_name[ 12 ] = "Stone Cold ";

       char last_name[ 13 ] = "Steve Austin";

       strcpy( first_name + 11, last_name );

       cout << first_name << endl; 

       return 0;

}

strcpy()最典型最常犯的错误!——数组定义的太小了!你想想看呐:last_name[]数组里的那13个字符复制到first_name[]数组里面后,那么原来的那12个字符大小的一亩三分地儿,还够用吗?肯定不够!!!所以,千万要提前定义得足够大!

 

 

错丙:

int main() {

       char* first_name = "Stone Cold ";

       char* last_name = "Steve Austin";

       strcpy( first_name, last_name );

       cout << first_name << endl;

       return 0;

}

错!根本就没有用数组!必须得是数组!即便是你甘心让last_name覆盖了first_name、最后输出Steve Austin,也不行!其实这么干,编译也不会报错,但一执行,电脑就有死机倾向了,根本无法执行,一执行必死机……

 

例丁:

int main() {

       string first_name = "Stone Cold ";

       string last_name = "Steve Austin";

       strcpy( first_name + 11, last_name );

       cout << first_name << endl;

       return 0;

}

不行!大错特错!虽然从函数名上看它是string copy的缩写,但它是属于C函数,而在C函数中根本就没有什么string类!!所以你直接用strcpy()来操作string类型的数据注定失败!!

 

我地个亲娘来!这么容易犯错呀!!那么到底什么才是正确的实验、使用方法呢!别急,且看:

 

int main() {

       char first_name[ 500 ] = "Stone Cold "; // 千万提前定义足够大的数组!为后来存储接纳新的数据做好准备!

       char last_name[ 20 ] = "Steve Austin";

       strcpy( first_name + 11, last_name ); //请千万找准连体的位置,否则遗恨终身!

       cout << first_name << endl;

       return 0;

}

这便是strcpy()的最佳范例!其原则如下:1、千万足够大;2、找准连体位置;3、只用于数组,不用于string, char*什么的。

额外地,咱再补充一点:strcpy() 复制时,是连同结束标志 ‘\0’ 一起复制的,而原数组(即参数1)的’\0’被舍弃。咱们锱珠必较地实验一下啊:

       char first_name[ ] = "Stone Cold "; first_name数组里有11个字符外加一个‘\0’,总共占用12个字节。同理,last_name[]占用13个字节。把last_name[]的13个字节复制给first_name[]之后,它就最少得占用25个字节了。实则不然,只占24!因为first_name[]里的结束标志‘\0’被抛弃了。这样一来,下面的程序就运行得通了:

 

 

int main() {

       char first_name[ 24 ] = "Stone Cold ";

       char last_name[ 13 ] = "Steve Austin";

       strcpy( first_name + 11, last_name );

       cout << first_name << endl;

       return 0;

}

不过话说回来,希望大家在实际编程中不要这么干,因为万一有个闪失,程序就会出错。定义数组时尽管大方一点,多几个闲着的城池无所谓!

 

那么,还有一个呀——strcat()是哪个老几?它又有何用?

strcat 的原形为:char *strcat( char *str1, const char *str2 ); 其实它和strcpy的功用有相似之处。它是把第二个参数的内容连接复制到第一个参数内容的尾巴上。如此看来,针对本题而言,它比strcpy()更合适、更简便,即:

int main() {

       char first_name[ 24 ] = "Stone Cold "; //依然是前者的结束标志‘\0’被抛弃.

       char last_name[ 13 ] = "Steve Austin";

       strcat( first_name, last_name ); //无须找连体点,它自己会接上去!

       cout << first_name << endl;

       return 0;

}

如果你要问此函数的名字是什么单词的缩写。嗯?英语中有个动词concatenate, 意思是连接上,估计是把中间的cat提炼出来作为函数名的一部分吧,嘿嘿。

 

Ok,今天的内容就到这里啦!学习愉快!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值