鱼C论坛

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

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

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

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

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

x
#include<stdio.h>

void strcat(char *p, char *q, char *t);
char* strcat2(char *p, char *q);
int main(){
    char p[] = "aaaa";
    char q[] = "bbbb";
    char *prt;
    prt = strcat2(p, q);
    for(; *prt != '\0'; prt++)
        printf("%c", *prt);
    return 0;
}
void strcat(char *p, char *q, char *t){
    while(*t++ = *p++)
        ;
    while(*t++ = *q++)
        ;
}
char* strcat2(char *p, char *q){
    static char *t;
    while(*t++ = *p++)
        ;
    while(*t++ = *q++)
        ;
    return t;
}
请教什么原因
最佳答案
2017-10-13 11:32:38
#include <stdio.h>
#include <stdlib.h>

typedef char * Bchar;

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

int main(void)
{
    char p[] = "aaaa";
    char q[] = "bbbb";
    char *prt1, *prt2;

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

        prt2 = strcat2(p, q);    
        printf("stract2:%s\n", prt2);
    
        return 0;
}

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

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

    while(*t++ = *p++)
        ;
        t--;
    while(*t++ = *q++)
        ;
    
        return b;
}
想知道小甲鱼最近在做啥?请访问 -> 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

typedef char * Bchar;

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

int main(void)
{
    char p[] = "aaaa";
    char q[] = "bbbb";
    char *prt1, *prt2;

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

        prt2 = strcat2(p, q);    
        printf("stract2:%s\n", prt2);
    
        return 0;
}

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

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

    while(*t++ = *p++)
        ;
        t--;
    while(*t++ = *q++)
        ;
    
        return b;
}
想知道小甲鱼最近在做啥?请访问 -> 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的意思呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-13 13:16:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-30 21:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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