字符串基本操作(C语言)

字符串之间的复制&连接:

C语言提供了丰富的内置函数,使得程序更清晰、易维护、分模块方便设计与开发、提高代码的重用性。
本章主要用来讨论字符串的复制以及连接方式。

1.1字符串的复制

C语言中可以使用strcpy函数来实现,其声明如下:char *strcpy(char *p1,const char *p2);虽然这种手段有一些漏洞(可能会溢出),但是如果提前分配好字符串的存储空间那也没什么问题。

1.1.1代码应用
#include
#include
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
#include
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
#include
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月

你可能感兴趣的:(字符串基本操作(C语言))