个人主页
仍有未知等待探索_数据结构,C语言疑难,小项目-CSDN博客
专题分栏---C语言疑难
谢谢大家的支持!!!
目录
一、前言
在平时的使用中,对于字符串的操作还是比较频繁的,比如:计算字符串的长度,字符串拷贝等等。虽然实现这些功能并不是很繁琐,但是如果我们能够直接调用一些库函数的话,对于代码量来说的话,还是比较简洁的。好了废话不多说,直接上讲解。
二、讲解
注:下面的库函数的头文件为string.h
1.求字符串长度函数(strlen)
1)用法:
参数是指向所求字符串的指针。
2)注意点:
strlen的终止条件是:遇到'\0'(不包含’\0‘);
其返回值类型是无符号整数(无符号整数-无符号整数永远>=0);
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "strstr";
char str2[] = "str\0str";
printf("str1:%d\n",strlen(str1));
printf("str2:%d\n",strlen(str2));
return 0;
}
2.字符串拷贝函数(strcpy)长度不受限
1)用法:
destination是要拷贝到的数组,source是被拷贝的数组。
2)注意点:
char* destination空间必须足够大并且必须可修改,同样地,遇到‘\0’结束
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7];//destination
char str2[] = "str\0str";//source
strcpy(str1, str2);
printf("str1:%s\n",str1);
printf("str2:%s\n",str2);
return 0;
}
3.字符串追加函数(strcat)长度不受限
1)用法:
把source的字符串追加到destination上。
2)注意点:
注意destination的空间大小必须是足够的。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7]="str";
char str2[] = "str\0str";
strcat(str1, str2);
printf("str1:%s\n", str1);
printf("str2:%s\n", str2);
return 0;
}
4.字符串比较函数(strcmp)长度不受限
1)用法:
将str1和str2进行比较。
2)注意点:
strcmp比较的不是字符串的长度,而是它的ASCII码值。(将str1的第一个字符和str2的第一个字符进行比较其ASCII码值,如果小于,则返回<0;如果大于,则返回>0;如果相等,则比较下一个字符,然后如上)
#include<stdio.h>
#include<string.h>
int main()
{
//判断str1和str2的大小关系,并打印大小关系符
char str1[7] = "str";
char str2[] = "str\0str";
int ret = strcmp(str1, str2);
if (ret > 0)
printf(">");
else if (ret < 0)
printf("<");
else
printf("=");
return 0;
}
5. 求字符串字串函数(strstr)长度不受限
1)用法:
在str1中查找是否含有字串str2,找到了返回在str1中字串的地址。
2)注意点:
在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[7] = "strcmp";
char str2[] = "str";
char*ret = strstr(str1, str2);
if (ret == NULL)
printf("未找到\n");
else
{
printf("%s", ret);
}
return 0;
}
三、个别实现
1、求字符串长度的函数实现(strcpy)
这个函数的实现比较简单,并且可以用多种方式进行实现。
1.循环
#include<stdio.h> int my_strlen2(char* arr) { int i = 0; while (*(arr + i) != '\0')//如果遇到'\0'结束,'\0'不算作字符串长度 i++; return i; } int main() { char arr[] = "abcdef"; int ret2 = my_strlen2(arr); printf("迭代:%d\n", ret2); return 0; }
2.递归
#include<stdio.h> int my_strlen1(char* arr) { if (*arr != '\0') return 1 + my_strlen1(arr + 1); else return 0; } int main() { char arr[] = "abcdef"; int ret1 = my_strlen1(arr); printf("%d\n", ret1);//递归: return 0; }
3.指针运算
根据两个指针相减等于两个地址在内存中间隔多少个指针类型的字节倍数。因为这两个指针都指向了字符型数组,数组是连续的,所以可以代表有多少个元素。
#include<stdio.h> char* my_strlen(char* arr) { char*p=arr; while(*p!='\0') p++; return p; } int main() { char arr[] = "abcdef"; char* ret = my_strlen(arr); printf("%d\n", ret-arr); return 0; }
2、其他的可以自己进行实现
提示:strstr除了暴力求解以外,还可以用KMP算法,自己可以去研究一下。