2022/11/24 [指针] 用函数调用实现字符串的复制(字符型指针)
admin
2024-02-13 10:38:01
0

解题思路:定义一个函数copy_string 用来实现字符串复制的功能,在主函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量

(1)用字符数组名作为函数参数

#include 
int main()
{
void copy_string(char from[],char to[]);
char a[] = "I am a teacher.";
char b[] = "You are a student.";
printf("string a=%s\nstring b=%s\n", a, b); 
printf("copy string a to string b:\n");
copy_string(a, b);
printf("\nstring a= %s\nstring b=%s\n", a, b);
return 0;
}
void copy_string(char from[], char to[])
{int i = 0;while (from[i] != '\0'){to[i] = from[i];i++;}to[i] = '\0';
}

(2)用字符型指针变量作实参
 

#include
int main()
{void copy_string(char from[], char to[]);char a[] = "I am a teacher.";char b[] = "You are a student."; char* from = a, * to = b;printf("string a= %s\nstring b=%s\n",a, b); printf("\ncopy string a to string b: \n");copy_string(from, to);//字符型指针变量作品作实参printf("string a=%s\nstring b=%s\n", a, b);return 0;
}
void copy_string(char from[], char to[])
{int i = 0;while (from[i] != '\0'){to[i] = from[i];i++;}to[i] = '\0';
}

程序分析:指针变量from的值是a数组首元素的地址,指针变量to的值是b数组首元素的地址。它们作为实参,把a数组首元素的地址和b数组首元素的地址传递给形参数组名from和 to(它们实质上也是指针变量),其他与程序(1)相同。
 

 

(3)用字符指针变量作形参和实参

#include
int main()
{void copy_string(char* from, char* to);char* a = "I am a teacher.";char b[] = "You are a student.";//定义b为字符数组char* p = b;printf("string a=%s\nstring b=%s\n", a, b);printf("\ncopy string a to string b: \n");copy_string(a, p);//通过p改变bprintf("string a=%s\nstring b=%s\n", a, b);return 0;
}
void copy_string(char* from, char* to)
{for (; *from != '\0'; from++, to++){*to = *from;}*to = '\0';
}

程序改进:

(1)将copy_string函数改写为

void copy_string(char * from,char * to)

{while (( * to= * from)!='\0')

{to++;from++;}

这是先赋值后判断,免去了最后还要给*to赋空字符额外的一步。

 

(2) copy_string函数的函数体还可改为

{ while (( * to++= * from++)!='\0') ;}
将++放在了一起,即赋值判断后再各自++

或者写成:{while ( * from!='\0')
*to++=* from++;

* to='\0'; }

 

(3)由于字符可以用其ASCII 码来代替(例如,“ch='a'”可用“ch= 97”代替,“while(ch!='a')”可以用“while(ch!=97)因此,“while( * from!='\0')”可以用‘while( * from! =0)”代替('\0'的ASCII代码
而关系表达式“*from!=0”又可简化为*from”,这是因为* from的值不等于0,则表达式“* from”为真,同时“ * from!=0”也为真。因此“while( * from!=0)”和“while(* from)”是等价的。所以函数体可简化为

{ while ( * from)
* to++= * from++;

*to='\0’;
}
以上的while语句还等价于:while(*to++=*from++)

等价于:while((*to++=*from++)!='\0')

 

(4)也可以用字符数组名作函数形参,在函数中另定义两个指针变量pl,p2。函数copy_string可写为:

void copy_string(char from[],char to[])

{

char * p1,* p2;
pl=from; p2=to;
while(( * p2++=* p1++)!='\0');

}
 

相关内容

热门资讯

一季度增长12.2%后,王莉定... 来源:茅台时空 据茅台官微报道,茅台酱香系列酒一季度交出营业收入78.8亿元、同比增长12.2%的成...
曦智科技沈亦晨:将与上海国资联... 曦智科技创始人、董事长沈亦晨 图片来源:主办方供图 5月10日,上海曦智科技创始人、董事长沈亦晨出现...
东实环境“还贷式IPO”困境:... 图源:图虫创意 来源|时代商业研究院 作者|特约研究员赖钧洪、郑琳 编辑|郑琳 作为东莞市国资委10...
为什么是宁波?扛起中国五金出口... 中国作为全球最大的五金制品生产国和出口国,正以绿色转型、品牌出海为方向,在全球五金供应链中占据核心地...
微信:关于开展涉税虚假宣传信息... 近期,平台接到用户投诉举报,发现个别账户发布“纳税15万,国家补贴5万”“4月恢复核定征收”等涉税虚...
央视调查:AI“买家秀”误导消... IT之家 5 月 10 日消息,据央视新闻今日报道,在网购场景中,由于消费者无法直接接触商品,所以评...
(机遇香港)“温情经济”升温 ... 中新社香港5月10日电 (记者 邱兆翔)5月10日是母亲节。在香港,不少子女与父母一早出门饮茶庆祝,...
原创 3... 5月8日,彭博社一段视频访谈把华尔街炸了。有"新债王"之称的双线资本创始人冈拉克,公开承认自己已经在...
网点关停潮?一半全国性银行机构... 营业网点是商业银行经营的最小细胞,也是直接触达客户、创造价值的核心战场,其竞争力直接关系到银行经营效...
粮农组织:战火阴影下4月全球食... 来源:财联社 联合国粮农组织(FAO)周五指出,由于中东局势紧张及霍尔木兹海峡反复被封,全球粮食价格...
原创 帮... 老铁们,帮主又来了。今天聊个事儿,保证让你觉得,原来国家战略离你的钱包可以这么近!四部门刚发了个文,...
吸引全球资本,亚洲新一轮“超级... 投资者正将目光转向亚洲,寻找全球股市上涨行情的下一个突破口。 在人工智能浪潮驱动下,韩国股市本月涨幅...
越秀区多维经营账服务细致入微的... 越秀区多维经营账服务细致入微的代理机构参考 在广州越秀区这一商贸活跃的核心区域,中小企业对财税服务...
教人挣钱的自媒体平台叫什么 教人挣钱的自媒体平台叫什么?这问题问得太到位了。说实话,我也曾经翻遍全网、踩过无数坑,就为了找一个真...
湖人被无情戏耍又是三节崩 里夫... 与雷霆的半决赛打到第三场,一种无望的情绪已彻底裹挟了湖人全队,彻底无法被摆脱了。 所有人都清楚,湖人...
原创 欧... 据环球网综合报道,欧盟正处于前所未有的抉择压力之下。在俄乌冲突延续近四年的沉重阴影下,欧盟内部关于援...
原创 1... 雷达财经出品 文|丁禹 编|孟帅 五一假期刚刚结束,市值百亿的川酒上市公司水井坊,其核心管理层再次迎...
美银Hartnett:材料板块... 美银证券首席投资策略师Michael Hartnett在最新报告中点名材料板块,称其将是下一个“牛市...
情绪消费的好日子,还剩多久 文|强调Next 2025年是中国潮玩行业最热闹的一年,也是从业者最难熬的一年。 热闹是真的热闹。...