首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

腾讯口试,实现函数

2013-04-21 
腾讯面试,实现函数参加腾讯面试,请实现这个函数char * strcat(const char *strA, const char *strB)腾讯面

腾讯面试,实现函数
参加腾讯面试,请实现这个函数
char * strcat(const char *strA, const char *strB) 腾讯 面试 strcat
[解决办法]

// 调用者负责释放返回的指针指向的空间
char * Mystrcat(const char *strA, const char *strB)
{
    if (strA == NULL 
[解决办法]
 strB == NULL)
    {
        return NULL;
    } 
    else
    {
        int nLenA =strlen(strA);
        int nLenB =strlen(strB);
        char *str = new char[nLenA+nLenB+1];
        memcpy(str ,strA ,nLenA);
        memcpy(str + nLenA ,strB,nLenB);
        *(str + nLenA + nLenB) = '\0';
        return str;
    }
}

[解决办法]
出题的人太坏了,两个参数都是const,明显要函数内用static数据返回指针,但是数据长度又不给。。。。
不过还好字符串长度似乎不能超过2^32-1,也就是 4294967295
char * strcat(char *strA, const char *strB)
{
     static unsigned int max_len =4294967295;
     static char szRet[4294967295];
     if (max_len -strlen(strA) <= strlen(strB)) 
          return NULL;
     sprintf(szRet,"%s%s",strA,strb);
   return szRet;
}


[解决办法]
引用:
C/C++ code?123456789101112131415161718// 调用者负责释放返回的指针指向的空间char * Mystrcat(const char *strA, const char *strB){    if (strA == NULL 
[解决办法]
 strB == NULL)    {        return NULL;    }     else ……

这个算法漏洞太多了

strlen如果结果为0呢?

你怎么办,

assert(s1&&s2);
static char szBuf[2的32次方-1];
char const*p=s1;
char const* q=szBuf;
while(*p!='\0')
{
*q++=*p+=;
};
p=s2;

while(*p!='\0');
{
*q++=*p++;
}
*q='\0';
return szBuf;


[解决办法]
其实他们考察的是 错误处理,比如参数为null

char* strcat(const char* a, const char* b)
{
    int n1 = strlen(a), n2 = strlen(b);  // a和b为null是可以计算长度的
    int n = n1 + n2;
    char* p = new char[n + 1];
    if(n1)


      memcpy(p, a, n1);  // 你自己一个一个复制也可以
    if(n2)
      memcpy(p + n1, b, n2);
    p[n] = '\0';
    return p;
}


[解决办法]
BUF_SIZE初始化为1024, 忘改了. 
char * strcat(const char *strA, const char *strB)
{
    if (strA == NULL 
[解决办法]
 strB == NULL) return NULL;
    size_t BUF_SIZE = 1024, size = 0;
    char* buf = NULL;
    while (*strA != '\0' 
[解决办法]
 *strB != '\0' 
[解决办法]
 size >= BUF_SIZE)
    {
        if (!buf && !(buf = (char*)malloc(BUF_SIZE)))  return NULL;
        if (size >= BUF_SIZE && !(buf = (char*)realloc(buf, BUF_SIZE <<= 1)) && (free(buf), true)) return NULL;
        while (*strA != '\0' && size < BUF_SIZE) buf[size++] = *strA++;
        while (*strB != '\0' && size < BUF_SIZE) buf[size++] = *strB++;
    }
    return (buf[size] = '\0', (char*)realloc(buf, size+1));
}

热点排行