C语言处理字符串函数总结
1. strlen函数——求字符串长度
官网对于strlen函数的介绍:链接
1.1 strlen函数介绍
strlen函数是用于求字符串长度的函数。需要包含string.h
头文件。
需要注意的点:
1.形参指向的字符串必须以’\0’结尾
2.strlen函数返回类型是size_t,是无符号整型
1.2 strlen使用案例
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "Hello World!";
printf("%d\n", strlen(str));
return 0;
}
程序运行结果:
1.3 strlen实现原理与自实现
strlen的工作原理就是遍历字符串数组并且使用一个变量进行计数,直到遇到’\0’为止,最后返回计数变量的值即为字符串长度。
自实现代码:
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
assert(str);
const char* start = str;
const char* end = str;
while (*end!='\0')
{
end++;
}
return end - start;
}
//法二
//size_t my_strlen(const char* str)
//{
// assert(str);
// int count = 0;
// char* start = str;
// while (*start!='\0')
// {
// count++;
// start++;
// }
//
// return count;
//}
int main()
{
char a[] = "abcdef";
printf("%d\n", my_strlen(a));
return 0;
}
2. strcpy函数——字符串复制
官网介绍:链接
2.1 strcpy函数介绍
strcpy函数的功能就是将一个字符串的内容复制到另一个字符串中。
需要注意的点:
1.源字符串必须以’\0’结尾
2.拷贝过程中会将源字符串的’\0’一起拷贝
3.目标字符串必须足够大,以至于能够装下源字符串
4.目标字符串必须可以改变(如常量字符串是不能作为目标字符串的)
2.2 strcpy使用案例
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abcdefg";//注意这里的arr1有20个字节的空间
char arr2[] = "hello world!";
strcpy(arr1, arr2);//将arr2的内容复制到arr1中
printf("%s", arr1);
return 0;
}
程序运行结果:
2.3 strcpy实现原理与自实现
我们可以先参考一下官方对于strcpy函数的介绍进行分析。
这里我们可以看到该函数接受了两个char类型的指针,分别指向目标和源头。那么我们现在站在开发者的角度,想一下该如何实现这个函数。需要进行四步:1.记录目标字符串的地址2.将source指向的内容依次赋给destination指向的空间中(单位为字节)。3.每一次赋值后,将source与destination进行自加,直到source指向的内容为’\0’为止。4. 返回目标字符串的首元素地址。
接下来请看代码:
char* my_strcpy(char* dest, const char* src)
{
//assert(dest && src);最好使用assert函数来检测传参的正确性
char* tmp = dest;
while (*dest++ = *src++)//这种写法直接将上面讲到的二三步一次做完了
{
;
}
return tmp;
}
3. strcat函数——字符串连接
官网介绍:链接
3.1 strcat函数介绍
strcat函数的作用是将一个字符串衔接在另一个字符串的后面。
需要注意的点
- 源字符串需要以’\0’结尾
- 目标字符串的空间需要足够大到能够衔接源字符串
- 目标字符串必须能够修改
- strcat不能给同一个字符串连接,即不能自己给自己衔接
3.2 strcat使用案例
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abcdefg";//目标字符串
char arr2[] = "Hello World!";
strcat(arr1, arr2);//源字符串
printf("%s", arr1);
return 0;
}
代码运行结果:
3.3 strcat实现原理与自实现
在官网的介绍中我们可以看到,strcat函数的设计与strcpy函数是挺相似的。它的实现原理是:1.先找到destination指向的字符串中的’\0’并记录位置 2.将source所指向的字符串从’\0’开始,向后拷贝。
具体实现代码:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* str = dest;
while (*str != '\0')//找到目标字符串中的'\0'
{
str++;
}
while (*str++ = *src++)
{
;
}
return dest;
}
int main()
{
char arr1[20] = "abcd";
char arr2[] = "efg";
printf("%s", my_strcat(arr1, arr2));
return 0;
}
注意:通过my_strcat的代码可以看出,是不能够通过my_strcat函数来实现自己与自己连接的。
举例:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* str = dest;
while (*str != '\0')
{
str++;
}
while (*str++ = *src++)
{
;
}
return dest;
}
int main()
{
char arr1[20] = "abc";
printf("%s", my_strcat(arr1, arr1));
return 0;
}
这个代码运行是会出错的,原因就是函数在连接时,将目标字符串的’\0’覆盖了。
4. strcmp函数——比较字符串大小
官网介绍:链接
4.1 strcmp函数的介绍
我们知道字符串是不能直接比较大小的,需要借助函数,而strcmp函数的作用就是比较两个字符串的大小。
比较的流程是依次比较两个字符串中的每一个字符的ASCII码值的大小,直到有一方遇到’\0’停止。
比较规则如下
- 第一个字符串大于第二个字符串则返回一个大于0的数
- 第一个字符串等于第二个字符串则返回0
- 第一个字符串小于第二个字符串则返回小于0的数
4.2 strcmp使用案例
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "hello";
if (strcmp(arr1, arr2) > 0)
printf("arr1>arr2\n");
else if (strcmp(arr1, arr2) == 0)
printf("arr1=arr2\n");
else
printf("arr1<arr2\n");
return 0;
}
4.3 strcmp实现原理与自实现
实现原理:在循环体中比较str1与str2所指向内容的ASCII码值,并且每比较完后,两个指针向后移动一个字节。循环结束的两个条件:1.比较的内容的ASCII值不同、2. 两者都为’\0’。
具体代码:
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* e1, const char* e2)
{
assert(e1 && e2);
while (*e1 == *e2)
{
e1++;
e2++;
if (*e1 == '\0')
return 0;
}
return *e1 - *e2;
}
int main()
{
char arr1[] = "abce";
char arr2[] = "abce";
if (my_strcmp(arr1, arr2) > 0)
printf("arr1>arr2");
else if (my_strcmp(arr1, arr2) == 0)
printf("arr1=arr2");
else
printf("arr1<aar2");
return 0;
}
5. 补充与拓展
5.1 strcnpy函数
官网介绍:链接
通过观察strncpy与strcpy两者的区别。可以发现strncpy函数多了一个参数。这个参数的意义是:操作字符串中字符的个数。也就是说我们可以通过strncpy函数,自己决定拷贝多少个字符而不是直接拷贝整个字符串至另一个字符串中。
使用案例:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "abcdefg";
char arr2[] = "xxxx";
strncpy(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
程序运行结果:
需要注意的点:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
举例:
5.2 strncmp函数
官网介绍:链接
同理,strncmp函数的作用就是可以自己选择比较两个字符串中的几个元素,而不是直接比较整个字符串。
使用案例:
这里可以看到,arr1其实是大于arr2的但是我们只比较了4个字符,所以结果是0,即相等
5.3 strncat函数
官网介绍:链接
strncat函数也是同理,可以选择连接字符的个数。但是strncat比较特殊的功能是:可以自己连接自己。这一点是strcat函数做不到的。
接下来我们用strncat试试:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "abc";
printf("%s", strncat(arr1, arr1, 3));
return 0;
}
代码运行结果:
5.4 字符分类函数与字符转换函数
接下来再介绍两个字符转换函数:
int tolower ( int c );//将参数转成小写字母
int toupper ( int c );//将参数转成大写字母
总结
C语言中没有单独的字符串变量,所以有一些针对字符串的操作并不容易。本篇博客主要介绍了一些常用的用于对字符串操作的函数和一些自实现方法,希望对大家有帮助。