什么是字符串
字符串 - 是程序设计中的表示文本的一种数据类型。
在一般使用的字符串中,分为常量字符串与变量字符串。
常量字符串 - 即不可被修改的字符串
char*ar1 = "abcdefg"; "sdsdsdsdsd";
该处的两个字符串即为常量字符串 - 不能对值进行修改。
char arr[] = "hello world"; char a = 'c';
该处的arr与a即为变量字符串(字符) - 即可对值进行修改。
一般来说,C语言本身是没有字符串类型的,且字符串通常放在常量字符串中或者字符数组中。
求字符串长度 - strlen函数
在字符串的处理当中,我们经常需要使用到字符串的长度,除了sizeof操作符(返回一个对象或者类型所占的内存字节数)以外,在c语言库函数中,也存在一个可以用来求出字符串长度的函数strlen函数(string.h文件中)。
strlen函数的使用
#include<string.h>//使用字符串函数应该包含<string.h>文件 #include<stdio.h> void test1() { char arr[] = "abcdef"; int ret = strlen(arr); printf("%d\n", ret);//打印结果为6 } int main() { test1(); return 0; }
若是存在以下代码,该代码的输出是什么?为什么?
void test2() { char arr1[] = "abcd"; char arr2[] = "abcdefg"; if (strlen(arr1) - strlen(arr2) < 0) { printf("<\n"); } else printf(">\n"); }
当程序运行,我们可以发现结果为:
为什么结果不为 “<” ???
从cplusplus网站中可以看出,strlen函数是传入一个char*的指针,且返回的是一个size_t的值(无符号)的值;
在上面的代码中,arr1的长度为4,arr2的长度为7,相减即为 -3;
而strlen函数返回的是一个无符号的数,即将 -3 看为一个无符号的数。
-3 :
原码为 1000 0000 0000 0000 0000 0000 0000 0011
反码为 1111 1111 1111 1111 1111 1111 1111 1100
补码为 1111 1111 1111 1111 1111 1111 1111 1101
因为返回值为size_t类型,即将-3的补码当成原码进行计算
故打印为">"
strlen函数的原理
了解到了strlen函数返回的是一个size_of的值,且返回的值为该字符串’\0’之前的字符个数,既然如此,那么这里有一个问题 :
strlen函数的计算方式是到’\0’为止?
还是字符串个数中只是不包括’\0’的个数?
存在以下代码:
该代码打印出的结果是什么?
void test() { char arr[] = "abcd\0efgh\0ijk"; printf("%d\n",strlen(arr)); }
从打印结果可以大概推断出,strlen函数计数的是’\0’之前出现的字符,当该函数一个个字符查找知道找到’\0’则停止。
strlen函数的模拟实现
李姐到了strlen函数的原理,那是否能根据strlen函数的原理模拟出一个strlen函数?
可以!
根据strlen函数的原理,我们可以思考几种方法:
- 计数器:
创建一个变量作为计数器,且遍历字符串;每遍历一个非’\0’时,计数器变量+1;
size_t my_strlen_count(char* p) { size_t count = 0;//创建一个计数器变量 while (*p++ != '\0') {//遍历整个字符串 count++;//每当遇到一个非'\0'的字符则计数器+1 } return count; } void test1() { char arr[] = "abcdef"; int ret = my_strlen_count(arr); printf("%d\n", ret); } int main() { test1(); return 0; }
- 递归:
使用递归函数来遍历整个字符串,当不为’\0’则返回1+递归该函数,为’\0’则返回0;
size_t my_strlen_recur(char*p) { if (*p != '\0') { return 1 + my_strlen_recur(p + 1); } else { return 0; } } void test2() { char arr[] = "abcdef"; int ret = my_strlen_recur(arr); printf("%d\n", ret); } int main() { //test1(); test2(); return 0; }
- 地址-地址:
使用地址-地址的方法即为创建一个指针变量,并使该指针遍历整个字符串,直到找到’\0’,再用后面的指针减去前面的指针得到的即为之间字符的个数。
size_t my_strlen_dest_src(char* p) { char* pp = p; while (*++pp != '\0') { ; } return pp - p; } void test3() { char arr[] = "abcdef"; int ret = my_strlen_dest_src(arr); printf("%d\n", ret); } int main() { //test1(); //test2(); test3(); return 0; }