字符串之间的复制&连接:
C语言提供了丰富的内置函数,使得程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性。
本章主要用来讨论字符串的复制以及连接方式。
1.1字符串的复制
C语言中可以使用strcpy
函数来实现,其声明如下:char *strcpy(char *p1,const char *p2);
虽然这种手段有一些漏洞(可能会溢出),但是如果提前分配好字符串的存储空间那也没什么问题。
1.1.1代码应用
#include<stdio.h>
#include<string.h>
int main(){
char str1[]="hello world!";
char str2[40];
strcpy(str2,str1);//数组也是一种指针,所以只要数组头即可
printf("str2:%s\n",str2);
return 0;
}
输出结果为:
str2:hello world!
1.1.2函数实现过程
这种函数一般用于将一个字符串复制到一个空的字符串数组中char *strcpy(char *p1,const char *p2);
的内部实现我们也可以自己写:
char *strcpy(char *p1,const char *p2)
{
char *str = p1;
while(*p1++=*p2++);
return str;
}
1.1.3代码分析
其实这段代码以前的确一直看不懂,后来不断接触才稍有感悟,本段代码首先通过char *str = p1;
将空字符串数组首地址放到新建str里面,而while(*p1++==*p2++);
这句代码是真的巧妙,当时我也是看了半天才懂,我一直以为这是一条比值语句,后来才发现这其实是赋值语句,因为*和++运算优先级一样,所以从右到左运算,代码可以改写成while(*(p1++)=*(p2++))
其实也就是将p2地址的值挨个复制到p1里面,因为while语句只有里面为真即大于零才执行,等到p2的指针指向'\0'的时候恰好退出while语句,最后,因为p1的地址已经改变,所以第一句代码中的str即为p1原先的首地址,通过return str
返回复制后的字符串首地址,因为字符串是连续的,所以指针会一直往下走直到遇到结束符'\0'结束,此时str就是函数执行所需要的结果。
1.2字符串的选择性复制
这个函数的实现其实也是基于上一个复制函数的基础上实现的,不过这像一个升级版本的复制,将p2中有限个的数字复制到p1中。函数头如下:char *strncpy(char *p1,const char*p2,size_t num);
size_t其实就是无符号整形等价于unsigned int.
1.2.1代码应用:
#include<stdio.h>
#include<string.h>
int main()
{
char str2[]="jiangxinwei is the most handsome";
char str1[40];
strncpy(str1,str2,11);
str1[11]='\0';
puts(str1);
return 0;
}
1.2.2其运行结果为:
jiangxinwei
因为这段代码和上一段代码基本作用差别不大,所以就不再一一分析。
2.1字符串的连接
顾名思义,将两个字符串连在一起,也就是将p2字符串连同末尾的null字符串一同复制到p1的末端存储空间之中。通过函数头char *strcat(char *p1,const char *p2);
来调用。
2.1.1代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char str[40]="jiang ";
strcat(str,"su");
puts(str);
return 0;
}
2.1.2运行结果:
jiang su
2.1.3内置函数实现过程:
char *strcat( char *p1,const *p2)
{
char *p3 = p1;
while (*p1)
p1++;
while(*p1++=*p2++);
return p3;
}
2.1.4代码分析:
其实这段代码还是和之前的复制代码strcpy
差不多的,先将目的字符串首地址记录下来,通过while循环使得地址移到字符串的末端存储空间,接着将strcpy
过程复制下来即可,相互借鉴即可。
总结:
许多编程思想都是很相似的,没有什么是最好的,关键的是编程思维的拓展与提升,只有不断地领悟,才会有所收获。
编者
2018年12月
网友评论