VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2436|亚博体育登录失败: 11
打印 上一主题 下一主题

【有奖竞猜】字符串的连接!

[复制链接]
51_avatar_middle
跳转到指定楼层
1#
online_admins 发表于 2010-1-11 11:38:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10驿站币
问题:请将 char *str3cat(char *str_1, char *str_2, char *str_3) 函数补充完整!

说明:str3cat 函数的功能是实现字符串的连接,即,将 str_1,str_2,str_3 三个参数所指向的字符串按顺序连接在一起,通过其返回值返回新字符串的地址。
例如:str_1为"123",str_2为"456",str_3为"789",则连接后的结果为:"123456789"

注:如果其中任何一个字符串为NULL,则将剩下的字符串进行连接,若三个字符串都为NULL,则本函数返回NULL。

请不要使用任何辅助的库函数,谢谢合作!

只需要补全 str3cat 函数即可,其他的函数请不要修改!

答对有奖哦,赶快来参加吧!【有奖竞猜】字符串的连接!
  1. #include "StdAfx.h"
  2. #include <iostream>

  3. using namespace std;

  4. char *AllocMemory(unsigned int nAllocLen)
  5. {
  6.         char *pTemBuf = new char[nAllocLen];
  7.         return pTemBuf;
  8. }

  9. void FreeMemory(char *tBuf)
  10. {
  11.         delete [] tBuf;
  12. }

  13. char *str3cat(char *str_1, char *str_2, char *str_3)
  14. {
  15.         //请补全本函数的功能;
  16. }

  17. int main()
  18. {
  19.         char *str1 = "123", *str2 = "456", *str3 = "789";
  20.         //////////////////////////////////////////
  21.         str1 = str3cat(str1, str2, str3);
  22.         cout << "The new string is : " << str1 << endl;
  23.         //////////////////////////////////////////
  24.         FreeMemory(str1);
  25.         return 0;
  26. }
复制代码

最佳答案

查看完整内容

3字符串拼接函数,不用任何库函数,有对NULL处理 二楼用了std::string不合题意,另对第一个字符串为NULL的也处理不好 其他两位没处理NULL




上一篇:很久没有有奖竞猜了
下一篇:[无奖竞猜]不要运行下面的代码,猜猜看打印出的是什么图形
88_avatar_middle
2#
在线会员 发表于 2010-1-11 11:38:06 | 只看该作者
本帖最后由 代码魔法师 于 2010-1-18 11:05 编辑

3字符串拼接函数,不用任何库函数,有对NULL处理
二楼用了std::string不合题意,另对第一个字符串为NULL的也处理不好
其他两位没处理NULL
  1. char *str3cat(char *str_1, char *str_2, char *str_3)
  2. {
  3.         //得到字符串长度宏定义
  4. #define _STRLEN(str,len) if(str!=NULL)\
  5.                 {const char *eos = str;while( *eos++ );len=eos-str-1;}\
  6.                 else len = 0;
  7.         //拷贝拼接字符串宏定义
  8. #define _STRCPY(dest,source) {if(source!=NULL)\
  9.         {while(*dest++ = *source++);--dest;}}
  10.        
  11.         int len = 0;
  12.         int templen=0;
  13.        
  14.         if (str_1==NULL && str_2==NULL && str_3==NULL)
  15.         {
  16.                 return NULL;
  17.         }
  18.         //求三字符串总长
  19.         _STRLEN(str_1,len);
  20.         _STRLEN(str_2,templen);
  21.         len+=templen;
  22.         _STRLEN(str_3,templen);
  23.         len+=templen;
  24.        
  25.         //拷贝拼接字符串
  26.         char *strout = AllocMemory(len+1);//申请空间
  27.         char *cp = strout;//strout留着返回用
  28.         _STRCPY(cp,str_1);
  29.         _STRCPY(cp,str_2);
  30.         _STRCPY(cp,str_3);

  31.         return strout;
  32. }
复制代码
60_avatar_middle
3#
在线会员 发表于 2010-1-11 12:09:26 | 只看该作者

  1. char *str3cat(char *str_1, char *str_2, char *str_3)
  2. {
  3.         //请补全本函数的功能;

  4.         const char*str_arr[] = {str_1 , str_2 ,str_3,NULL};
  5.         int i=0;
  6.         std::string result;

  7.         for(;str_arr[i];i++)
  8.         {
  9.                 if(NULL != str_arr[i])
  10.                 {
  11.                         result += str_arr[i];
  12.                 }
  13.         }

  14.         unsigned int str_size = result.size();

  15.         if(0 == str_size)
  16.         {
  17.                 return NULL;
  18.         }

  19.         char *pnewstr = AllocMemory(str_size+1);
  20.         const char *psrc = result.c_str();

  21.         for (i = 0; psrc[i] ; i++)
  22.         {
  23.                 pnewstr[i] = psrc[i];
  24.         }
  25.         pnewstr[i] =0;
  26.         return pnewstr;
  27. }
复制代码

评分

参与人数 1驿站币 +5 收起 理由
56_avatar_small zhaoshengbo + 5

查看全部评分

32_avatar_middle
4#
在线会员 发表于 2010-1-11 18:49:25 | 只看该作者

  1. char *str3cat(char *str_1, char *str_2, char *str_3)
  2. {
  3.         //请补全本函数的功能;
  4.         int l;
  5.         char * str,* p;
  6.         l=0;
  7.         p=str_1;
  8.         while(*str_1++)
  9.                 l++;
  10.         str_1=p;
  11.         p=str_2;
  12.         while(*str_2++)
  13.                 l++;
  14.         str_2=p;
  15.         p=str_3;
  16.         while(*str_3++)
  17.                 l++;
  18.         str_3=p;
  19.         if(0==l)
  20.                 return(NULL);
  21.         str=AllocMemory(l+1);
  22.         p=str;
  23.         while(*str_1)
  24.                 *str++=*str_1++;
  25.         while(*str_2)
  26.                 *str++=*str_2++;
  27.         while(*str_3)
  28.                 *str++=*str_3++;
  29.         *str='\0';
  30.         return(p);
  31. }
复制代码

评分

参与人数 1驿站币 +5 收起 理由
56_avatar_small zhaoshengbo + 5

查看全部评分

56_avatar_middle
5#
在线会员 发表于 2010-1-12 15:52:34 | 只看该作者
大家都来啊...【有奖竞猜】字符串的连接!
38_avatar_middle
6#
在线会员 发表于 2010-1-17 20:34:19 | 只看该作者

  1. //#include "StdAfx.h"
  2. #include <iostream>

  3. using namespace std;

  4. char *AllocMemory(unsigned int nAllocLen)
  5. {
  6.         char *pTemBuf = new char[nAllocLen];
  7.         return pTemBuf;
  8. }

  9. void FreeMemory(char *tBuf)
  10. {
  11.         delete [] tBuf;
  12. }

  13. char *str3cat(char *str_1, char *str_2, char *str_3)
  14. {
  15.         //请补全本函数的功能;
  16.         int len=0;
  17.         char* cTemp=str_1;
  18.         for(;*cTemp != '\0';cTemp++)
  19.                 len++;
  20.         cTemp=str_2;
  21.         for(;*cTemp!= '\0';cTemp++)
  22.                 len++;
  23.         cTemp=str_3;
  24.         for(;*cTemp != '\0';cTemp++)
  25.                 len++;
  26.         if(0==len)
  27.         {
  28.                 return str_1;
  29.         }

  30.         char *cResult=AllocMemory(len+1);
  31.         cResult[len]='\0';

  32.         cTemp=cResult;
  33.        
  34.         for(;*str_1 != '\0';str_1++,cResult++)
  35.                 *cResult = *str_1;
  36.         for(;*str_2 != '\0';str_2++,cResult++)
  37.                 *cResult = *str_2;
  38.         for(;*str_3 != '\0';str_3++,cResult++)
  39.                 *cResult = *str_3;
  40.   return cTemp;
  41. }

  42. int main()
  43. {
  44.         char *str1 = AllocMemory(4);
  45.         strcpy(str1, "123");
  46.         char *str2 = "456", *str3 = "789";
  47.         //////////////////////////////////////////
  48.         str1 = str3cat(str1, str2, str3);
  49.         cout << "The new string is : " << str1 << endl;
  50.         //////////////////////////////////////////
  51.         FreeMemory(str1);
  52.         system("pause");
  53.         return 0;
  54. }
复制代码
编译运行通过
32_avatar_middle
7#
在线会员 发表于 2010-1-18 19:04:46 | 只看该作者
请问楼上怎么处理NULL?
88_avatar_middle
8#
在线会员 发表于 2010-1-18 20:56:14 | 只看该作者
亚博体育登录失败 7# lizhi062368
当参数有NULL时要保证函数正确执行
如题 :如果其中任何一个字符串为NULL,则将剩下的字符串进行连接,若三个字符串都为NULL,则本函数返回NULL。

如果没进行错误处理则会导致函数结果错误或崩溃
比如比如str_1为NULL时
*str_1++这种操作通常会导致程序崩溃
所以这类操作前要进行判断str_1是否等于NULL
51_avatar_middle
9#
ico_lz  楼主| 发表于 2010-1-18 22:22:44 | 只看该作者
结贴喽!
最佳答案为:代码魔法师

关于说明其他会员的回答,代码魔法师 已经把问题都说了,这里我就不点评了!

代码魔法师 使用宏的方法进行的字符串求长度、字符串拷贝,大家可以学习学习!【有奖竞猜】字符串的连接!
60_avatar_middle
10#
在线会员 发表于 2010-1-19 00:06:37 | 只看该作者
哎呀呀,大意了大意了,忘了判断指针的NULL情况
32_avatar_middle
11#
在线会员 发表于 2010-1-19 18:40:27 | 只看该作者
学到了东西啊
34_avatar_middle
12#
在线会员 发表于 2010-6-14 21:27:17 | 只看该作者
char * str3cat(char *str_1,  char *str_2, char *str_3)
{
char * p=NULL;
char * p1=str_1;
char * p2=str_2;
char * p3=str_3;
char * p4=NULL;
int i=0;
while(*str_1++)
i++;       
while(*str_2++)
i++;       
while(*str_3++)
i++;
str_1=p1;
str_2=p2;
str_3=p3;
p=(char *)malloc(i+1);
p4=p;
while(*str_1)
*p++=*str_1++;
while(*str_2)
*p++=*str_2++;
while(*str_3)
*p++=*str_3++;
*p='\n';
return p4;

}
以经过测试,没有问题,谁有效率更高的算法????????
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-13 03:38

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速亚博体育登录失败 返回顶部 返回列表