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);
}

 

posted @ 2012-07-31 15:25  爱喝可乐  阅读(1491)  评论(0编辑  收藏  举报