C strcpy和strcat

strcpy的所谓正确写法:

char *strcpy(char *strDestination, const char *strSource)

    {

    assert(strDestination!=NULL && strSource!=NULL);

    char *strD=strDestination;

    while ((*strDestination++=*strSource++)!='\0')

    return strD;

    }
char *strcat(char *strDest, const char *strSrc) 

    {

    char *address = strDest;

    assert((strDest != NULL) && (strSrc != NULL));

    while(*strDest)

    {

        strDest++; 

    }

    while(*strDest++ = *strSrc++){}

    return address; 

    }

 

这就是所谓的面试笔试最常见最常见的,而且经常被鄙视的strcpy
头文件:string.h
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
好了,不说这四行代码到底为什么这么写,内事不决问百度去。
单说函数本身,传入的是两个指针,第二个是常指针,但是一个必须满足的条件是第一个参数必须传入一个char[]数组,而不可能是一个

char *a="fewfa";

这样的一个指针,或者更sb的是一个空指针

char *a;

字符数组初始化的时候要分配长度,不分配会默认,C#还是可以再次分配,不说这个,我的意思是说,我既然要拷贝一个字符串,那我怎么知道字符串多长!10w,百千,还是更多,那这个方法是不是在某些场合不适应,还有strcat,同样的问题,参数必须是一个足够大已经分配过内存的指针,如果没有分配足够内存,会出错。

荡漾了,写一个strcat(仅个人意见)

#include<stdio.h>

#include <stdlib.h>

#include <assert.h> 

char* strcat(char * strDest,const char * strSrc)

{

    char *from=strDest;

    const char *source=strSrc;



    assert((strDest!=NULL) && (strSrc !=NULL));

    int length=0;

    while(*strDest!='\0') 

    { 

        strDest++;

        length++;

    } 

    char * ret=(char *)malloc(length);

    char *back=ret;

    while(*(from)!='\0'&&(*ret++ = *from++)) {}

    while((*ret++ = *source++)!='\0') {}

    return back; 

} 



void main()

{

    char *a="fherweufashjewadfa";

    char *b="uiorewgfagipobagbi";

    char *c=strcat(a,b);int d=0;

    printf("%s\n",c);

    scanf("%d",d);

}

 

你可能感兴趣的:(RCP)