两个字符串相加,第一个方法能用,第二个不能用
#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: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;
} #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;
}
U201010009 发表于 2017-10-13 11:12
char* strcat2(char *p, char *q){
//static char *t; // 这里t未初始化,t应该指向有效的内存地址
...
*1024的意思呢 丶忘却的年少o 发表于 2017-10-13 11:32
*25意义是啥 kai759630 发表于 2017-10-13 13:16
*25意义是啥
当然是25个char长度的空间,用于存放你这两组数组字符,要是小你可以*100,*1000都可以,但是别使劲的申请太大,太占内存了,基本是比需求多这么几个就好了。
要是懂了麻烦点下“最佳答案”{:10_330:}
页:
[1]