kai759630 发表于 2017-10-13 10:42:06

两个字符串相加,第一个方法能用,第二个不能用

#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;
}

请教什么原因

U201010009 发表于 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;
}

丶忘却的年少o 发表于 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;
}

kai759630 发表于 2017-10-13 13:15:01

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

*1024的意思呢

kai759630 发表于 2017-10-13 13:16:06

丶忘却的年少o 发表于 2017-10-13 11:32


*25意义是啥

丶忘却的年少o 发表于 2017-10-13 13:20:54

kai759630 发表于 2017-10-13 13:16
*25意义是啥

当然是25个char长度的空间,用于存放你这两组数组字符,要是小你可以*100,*1000都可以,但是别使劲的申请太大,太占内存了,基本是比需求多这么几个就好了。
要是懂了麻烦点下“最佳答案”{:10_330:}
页: [1]
查看完整版本: 两个字符串相加,第一个方法能用,第二个不能用