鱼C论坛

 找回密码
 立即注册
查看: 2301|回复: 5

[已解决]两个字符串相加,第一个方法能用,第二个不能用

[复制链接]
发表于 2017-10-13 10:42:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include<stdio.h>

  2. void strcat(char *p, char *q, char *t);
  3. char* strcat2(char *p, char *q);
  4. int main(){
  5.     char p[] = "aaaa";
  6.     char q[] = "bbbb";
  7.     char *prt;
  8.     prt = strcat2(p, q);
  9.     for(; *prt != '\0'; prt++)
  10.         printf("%c", *prt);
  11.     return 0;
  12. }
  13. void strcat(char *p, char *q, char *t){
  14.     while(*t++ = *p++)
  15.         ;
  16.     while(*t++ = *q++)
  17.         ;
  18. }
  19. char* strcat2(char *p, char *q){
  20.     static char *t;
  21.     while(*t++ = *p++)
  22.         ;
  23.     while(*t++ = *q++)
  24.         ;
  25.     return t;
  26. }
复制代码

请教什么原因
最佳答案
2017-10-13 11:32:38
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char * Bchar;

  4. void strcat1(char *p, char *q, char *t);
  5. char* strcat2(char *p, char *q);

  6. int main(void)
  7. {
  8.     char p[] = "aaaa";
  9.     char q[] = "bbbb";
  10.     char *prt1, *prt2;

  11.         prt1 = (char *)malloc(sizeof(char)*25);        // prt1只是声明为给定义与空间存放,需要有一个空间
  12.    
  13.         strcat1(p, q, prt1);   
  14.         printf("stract1:%s\n", prt1);        // 直接%s打印会好一点

  15.         prt2 = strcat2(p, q);   
  16.         printf("stract2:%s\n", prt2);
  17.    
  18.         return 0;
  19. }

  20. void strcat1(char *p, char *q, char *t)
  21. {
  22.     while(*t++ = *p++)
  23.         ;
  24.         t--;                                // 去掉p[]末尾的'\0',就是让t回到前一个地址,用q数据覆盖
  25.     while(*t++ = *q++)
  26.         ;
  27. }

  28. char* strcat2(char *p, char *q)
  29. {
  30.     static char *t;
  31.         char *b;                // 用于保存t开始的地址,因为t一直往后走,传回去的是走到最后地址了,再打印就出错了
  32.        
  33.         t = (char *)malloc(sizeof(char)*25);
  34.         b = t;

  35.     while(*t++ = *p++)
  36.         ;
  37.         t--;
  38.     while(*t++ = *q++)
  39.         ;
  40.    
  41.         return b;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-10-13 11:12:38 | 显示全部楼层
本帖最后由 U201010009 于 2017-10-13 11:50 编辑

char* strcat2(char *p, char *q){
    //static char *t; // 这里t未初始化,t应该指向有效的内存地址
    static char* t = (char*)malloc(sizeof(char) * 1024);
    char* t1 = t;
    while(*t1++ = *p++)
        ;
    while(*t1++ = *q++)
        ;

    return t;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-13 11:32:38 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef char * Bchar;

  4. void strcat1(char *p, char *q, char *t);
  5. char* strcat2(char *p, char *q);

  6. int main(void)
  7. {
  8.     char p[] = "aaaa";
  9.     char q[] = "bbbb";
  10.     char *prt1, *prt2;

  11.         prt1 = (char *)malloc(sizeof(char)*25);        // prt1只是声明为给定义与空间存放,需要有一个空间
  12.    
  13.         strcat1(p, q, prt1);   
  14.         printf("stract1:%s\n", prt1);        // 直接%s打印会好一点

  15.         prt2 = strcat2(p, q);   
  16.         printf("stract2:%s\n", prt2);
  17.    
  18.         return 0;
  19. }

  20. void strcat1(char *p, char *q, char *t)
  21. {
  22.     while(*t++ = *p++)
  23.         ;
  24.         t--;                                // 去掉p[]末尾的'\0',就是让t回到前一个地址,用q数据覆盖
  25.     while(*t++ = *q++)
  26.         ;
  27. }

  28. char* strcat2(char *p, char *q)
  29. {
  30.     static char *t;
  31.         char *b;                // 用于保存t开始的地址,因为t一直往后走,传回去的是走到最后地址了,再打印就出错了
  32.        
  33.         t = (char *)malloc(sizeof(char)*25);
  34.         b = t;

  35.     while(*t++ = *p++)
  36.         ;
  37.         t--;
  38.     while(*t++ = *q++)
  39.         ;
  40.    
  41.         return b;
  42. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-13 13:15:01 | 显示全部楼层
U201010009 发表于 2017-10-13 11:12
char* strcat2(char *p, char *q){
    //static char *t; // 这里t未初始化,t应该指向有效的内存地址
  ...

*1024的意思呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-13 13:16:06 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-13 13:20:54 | 显示全部楼层

当然是25个char长度的空间,用于存放你这两组数组字符,要是小你可以*100,*1000都可以,但是别使劲的申请太大,太占内存了,基本是比需求多这么几个就好了。
要是懂了麻烦点下“最佳答案”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-30 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表