练习 5-3 用指针实现函数strcat(s,t)将t指向的字符串复制到s指向的字符串的尾部。


1. 首先想到就是的将字符串s循环到‘\0’的前一个字符,然后将字符串t的地址给此时的s地址。

 两个问题:

①这种s=t,是不对的,只是拷贝了指针,并没有进行字符串的复制?

②当执行语句 while(*s++);时,此时 *s='\0', 所以后面应该s--;或者这样写 while(*s)  s++;

③ 注意调用mystrcat(s,t)时 ,不能定义为字符串常量(不能修改)

例: char str[ ]="hello"; 

不能定义为 char *str="hello".

char* mystrcat(char* s, char* t)
{
    char* p;
    p = s;
    while (*s++)
        ;
    s = t; //不能将 字符串str2的首地址給 吗? 这样只拷贝了指针。
    return p;
}
int main()
{
    //char *str1 = "hello";  字符串常量 不能修改
    char str1[] = "hello";
    char* str2 = "world";
    printf("%s", strcat(str1, str2));
    return 0;
}

2 .

//from answer book
char* strcat(char* s, char* t)
{
    char* p;
    p = s;
    while (*s)
        s++;
    while (*s++ = *t++)
        ;
    return p;
}

3.利用strcpy来实现。

//利用 strcpy函数来实现
char* strcat3(char* dest, char* src)
{
    char* p = dest;
    strcpy(dest+ strlen(dest), src);
    return p;
}


4.看到一道笔试题,编写strcat函数,最后问strcat能把strSrc的内容连接到strDest,为什么还要char *类型的返回值?
   不明白讲的什么意思?

 

5. 注意以下代码:

此外,注意如下代码:
char *Func(void)
{
    char str[] = "hello world";
    return str;   //return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
}
 
char *Func(void)
{
    char *pstr = "hello world";//字符串常量存放在静态区
    return pstr;
}

后来在网上看了别人博客,理解了一些,比如下面一段代码。

返回指针时,下面的代码会出现问题。

解析:之前在别的地方看到一个很形象的解释,就是你去旅游,觉得当地的一家酒店的饭菜很有特色,于是就记下了它的地址门牌号之类的(相当于指针),当你回去之后,也就是函数调用完毕,返回这个指针是没有问题的,你回去之后是依然可以看这个地址门牌号的,但是当一段时间再去上次旅游的地方,可能那家酒店已经不存在了,可能变成了一家理发店或者其他什么的

所以,当函数调用结束,指针所指向的内容是存放在栈的,会随着函数一起销毁的,但是指针还是存在的,只不过此时指针指向的内容不确定,所以结果是会出错的。

 

include <stdio.h>
char*GetMemory(void)
{
    char p[]="hello world";  //
    return p;
}
int main(void)
{
    char *str=NULL;
    str=GetMemory();
    printf(str);
    return 0;
}

但是通过其他方法我们可以避免对指针返回的错误

比如延长指针的生命期,将其设置为静态变量,使其生命期延长至整个文件

或者设置成一个字符串的常量,让其存放在静态区中也是可以的

实现的代码如下

#include <stdio.h>
char *GetMemory(void)
{
	static char p[]="hello world";
	return p;
}
int main(void)
{
	printf("%s\n",GetMemory());
	return 0;
}


或 改为这样

#include <stdio.h>
char *GetMemory(void)
{
    char *p="hello world";
	return p;
}
int main(void)
{
	printf("%s\n",GetMemory());
	return 0;
}




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值