strcpy(,)是c语言库函数,作用是将后一个字符串复制到前一个字符串上(目标字符NULL),可用来对字符串进行赋值,调用这个函数需要包含头文件<string.h>。
#include <stdio.h>
#include <string.h>
int main(){
char str[128]={'\0'};
char *p="playVolleyballInTheEvening";
strcpy(str,p);
puts(str);
return 0;
}
通过上面的代码可以知道strcpy的用法。对于这种简单的函数,我们也可以自己定义。
char* myStrcpy(char *destination, char *source)
{
if(destination == NULL || source == NULL){
return NULL;
}
char *backups=destination;
while(*source != '\0'){
*destination = *source;
source++;
destination++;
}
*destination='\0';
return backups;
}
这是我定义出来的myStrcpy,可以看出这是一个指针函数,返回值是指针backups,而backups又指向目标字符串的首地址。函数的内容是,先对目标字符串和源字符串的内容的一个判断,如果其中有NULL,就直接返回NULL,不再进行下面的操作。然后定义一个指针backups,并令它指向目标字符串的首地址。接下来通过while循环来进行字符串中每一个字符的复制和指向两个字符串的指针的偏移。复制完后,在目标字符串的最后加上字符串的结束标志'\0'。最后返回backups指针。这里引入backups指针是因为在将源字符串复制到目标字符串的过程中,指向目标字符串的destination指针会发生偏移。
这是很基础的写法,我们可以加以改进,让它更简洁。
char* myStrcpy2(char *des, char *soc)
{
if(des == NULL || soc == NULL){
return NULL;
}
char *bak=des;
while(*soc != '\0'){
*des++ = *soc++;
}
*des='\0';
return bak;
}
myStrcpy2对myStrcpy中的指针名进行了简化,将while循环中的赋值和两个指针的偏移合并成了一句。还有一种写法,可能有些难理解,也很少用到,这里作了解。
char* myStrcpy3(char *des, char *soc)
{
if(des == NULL || soc == NULL){
return NULL;
}
char *bak=des;
while((*des++ = *soc++) != '\0');
*des='\0';
return bak;
}
myStrcpy3将while循环的操作和判断写在一起,虽然是极致的减少代码量,但我还是更喜欢myStrcpy2。
strncpy(, ,)函数的作用跟strcpy相同,只不过它能限制复制的长度,使用时也要包含头文件<string.h>。
#include <stdio.h>
#include <string.h>
int main(){
char str[128]={'\0'};
char *p="playVolleyballInTheEvening";
strncpy(str,p,50);
puts(str);
return 0;
}
这是strncpy的用法。有了前面定义mystrcpy的经验,我们可以在此基础上定义一个myStrncpy。
char* myStrncpy(char *des, char *soc, int len)
{
if(des == NULL || soc == NULL){
return NULL;
}
char *bak=des;
while(*soc != '\0' && len > 0){
*des++ = *soc++;
len--;
}
if(len > 0){
while(len > 0){
*des++='\0';
len--;
}
return bak;
}
*des='\0';
return bak;
}
myStrncpy的内容跟mysStrcpy比就是多了判断长度的部分。在while循环的判定中,多了len>0,循环要执行的操作中也多了len自减。当while循环结束后,还要再对len的大小进行判断。如果len大于0,说明源字符串的长度比我们要求复制的长度小,就再来一个while循环将后面不够的长度全部补上'\0',然后直接返回bak指针。如果len大于0;就是我们想看到的源字符串的长度比我们要求复制的长度大的情况,于是我们给目标字符串加上一个结束标志就可以返回bak了。