VC驿站

?找回密码
?加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2523|亚博体育登录失败: 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

  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

  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-9-15 14:13

Powered by Discuz! X3.4

? 2009-2019 cctry.com

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