目录
注:字符串函数的使用都需要string.h这个头文件。
1. strlen的使⽤和模拟实现
1.了解strlen函数
size_t strlen ( const char * str )
从上我们可以看到,strlen函数的返回类型是size_t类型,而需要传参的类型为char *类型的指针。
注意:
•
字符串以
'\0'
作为结束标志,strlen函数返回的是在字符串中 '\0'
前⾯出现的字符个数(不包
含
'\0'
)。
•
参数指向的字符串必须要以
'\0'
结束。
•
注意函数的返回值为size_t,是⽆符号的( 易错 )
2.strlen函数的使用
我们先用一个简单的代码来了解strlen函数大致的使用方法。
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdefg";
printf("%zd", strlen(arr));
return 0;
}
首先需要知道创建的arr数组内的内容不只有‘abcdefg’,还有一个‘\0’所以数组arr内的实际内容是[a,b,c,d,e,f,g,\0],所以strlen函数就是输出\0之前的元素个数并返回,如果没有\0,那么返回的就是随机值。
3.strlen函数的模拟实现。
1.计数器方法。
//1.计数器⽅式
size_t my_strlen1(const char* arr)
{
size_t count = 0;
while (*arr)//当*arr不为0是,循环继续,为0时则跳出循环。
{
count++;
arr++;
}
return count;
}
//计数器方法2
size_t my_strlen2(const char* arr)
{
const char* start = arr;//将首元素地址放在start中
while (*arr)
{
arr++;
}
return arr - start;//指针相减,算的是中间元素的个数。
}
int main()
{
char arr[] = "a,b,c";
int a = (int)my_strlen1(arr);
int b = (int)my_strlen2(arr);
printf("%d\n", a);
printf("%d\n", a);
return 0;
}
2.递归方法。
在不创建临时变量的情况下求字符串长度--递归。
size_t my_strlen3(const char* arr)
{
if (*arr == '\0')
return 0;
else
return 1 + my_strlen(arr + 1);
//my_strlen("abcdef");
//1+my_strlen("bcdef");
//1+1+my_strlen("cdef");
//1+1+1+my_strlen("def");
//1+1+1+1+my_strlen("ef");
//1+1+1+1+1+my_strlen("f");
//1+1+1+1+1+1+my_strlen("");
//1+1+1+1+1+1+0;
}
2. strcpy 的使⽤和模拟实现
1.了解strcpy函数
char
*
strcpy
(
char
* destination,
const char
* source )
函数的返回值为char *类型的指针,传入参数为一个可修改地址内容的指针以及一个不可修改地址内容的指针。
注意:
•
源字符串必须以
'\0'
结束。
•
会将源字符串中的
'\0'
拷⻉到⽬标空间。
•
⽬标空间必须⾜够⼤,以确保能存放源字符串。
•
⽬标空间必须可修改。
2.strcpy函数的使用
int main()
{
char arr[] = "xxxxxxxxxxxx";
char num[] = "hello word";
strcpy(arr, num);
printf("%s\n", arr);
return 0;
}
从运行结果能看出,strcpy函数就是把数组2的内容复制给数组1。
特别的,我们要注意数组1的内容必须为可修改的,同时数组1要足够大,至少要大于数组2.数组2中也一定要以‘\0’结尾。
在调试时,我们也可以发现复制时同时把‘\0’复制过去了。
3.strcpy函数的模拟实现
方法一:
void my_strcpy(char* arr, char* num)
{
while (*num != '\0')
{
*arr = *num;
arr++;
num++;
}
*arr = *num;//最后一次循环结束后,'\0'没有被复制,所以在跳出循环和在执行一次。
}
int main()
{
char arr[] = "abcdefghigk";
char * num = "hello word";
my_strcpy(arr, num);
printf("%s", arr);
return 0;
}
方法2:
char* my_strcpy(char* dest, char* src)
{
/*assert(dest != NULL);
assert(src != NULL);*/
char* ret = dest;//将首元素的地址传给ret
assert(dest && src);//当都不为空指针时就继续进行。
while (*dest++ = *src++)//先将*str的值赋给*dest,然后进行dest++,str++
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "abcdef";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
3. strcat 的使⽤和模拟实现
1.了解strcat函数
char * strcat ( char * destination, const char * source ); strcat函数与strcpy函数一样,所返回的类型都是char *类型,以及所需要的参数一个为可修改地址内容的指针和一个不可修改地址内容的指针。 注意: • 源字符串必须以 '\0' 结束。 • ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。 • ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。 • ⽬标空间必须可修改。
2.strcat函数的使用
int main()
{
char arr[20] = "hello";
char* num = "world";
strcat(arr, num);
printf("%s", arr);
return 0;
}
可以看出,strcat函数就是在一个字符串后继续插入一个字符串。
特别的,需要保证数组足够大。同时,数组与数组2都应以‘\0’结尾,因为插入是从数组1的‘\0’\开始,从数组2的‘\0’结束。
3.strcat函数的模拟实现
1.基础简单法
void my_strcat(char* arr, char* num)
{
while (*arr)
{
arr++;
}
while (*num)
{
*arr = *num;
arr++;
num++;
}
*arr = *num;
}
int main()
{
char arr[20] = "hello ";
char* num = "world";
my_strcat(arr, num);
printf("%s", arr);
return 0;
}
2.进阶法
char* my_strcat(char* arr, char* num)
{
char* ret = arr;
while (*arr)//1. 找到目标空间的\0
{
arr++;
}
while (*arr++ = *num++)//2. 拷贝
{
;
}
return ret;
}
int main()
{
char arr[20] = "hello ";
char* num = "world";
char * ret=my_strcat(arr, num);
printf("%s", ret);
return 0;
}
4. strcmp 的使⽤和模拟实现
1.了解strcmp函数
int strcmp (const char * str1, const char * str2 ) strcmp函数的返回类型是int类型,参数是两个不能改变地址内容的指针。
2.strcmp函数的使用
int main()
{
int z = strcmp("abc", "cde");
if (z > 0)
{
printf("大于\n");
}
else if (z < 0)
{
printf("小于\n");
}
else
printf("等于\n");
return 0;
}
从上我们可以看出,strcmp函数是来比较两个字符串的大小。
通常比较的是字符串首元素ascill码的大小,当首元素大小相同时,则比较第二个元素。
上图可以看出,当字符串1大于字符串2时,返回的是一个大于1的值;等于时,返回0;小于时,返回小于0的数。
3.strcmp函数的模拟实现
int my_strcmp(const char* arr,const char* num)
{
while (*arr == *num)
{
if (*arr == '\0')
return 0;
arr++;
num++;
}
if (*arr > *num)
return 1;
else
return -1;
}
int main()
{
char* arr = "abcde";
char* num = "abdfg";
int z = my_strcmp(arr, num);
if (z > 0)
{
printf("大于\n");
}
else if (z < 0)
{
printf("小于\n");
}
else
printf("等于\n");
return 0;
}
以上就是这篇所讲的全部内容,还有strstr函数,strtok函数以及strerror函数,我们下一篇见。