做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,今天的内容就到这里啦!学习愉快!