C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现
Posted 赏一杯茶:
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现相关的知识,希望对你有一定的参考价值。
前言
C语言中对字符和字符串的处理是很频繁的,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数
一、strlen
strlen | —————————— |
---|---|
参数类型 | (const char* str) |
返回类型 | (size_t) |
功能 | 求解字符串长度 |
- 字符串以 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中‘\\0’前面出现的字符个数。(不包含‘\\0’)
- 参数指向的字符串必须要以‘\\0’结束
- 注意函数的返回值是size_t,是无符号类型的(易错)
- strlen模拟实现
遍历字符串中的每个字符,发现不是‘\\0’就计数一次,直到发现’\\0’后返回总计数次
- ①计数法实现strlen
int my_strlen1(const char *str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[20];
gets(arr);
int ret = my_strlen1(arr);//1.计数器方式
printf("%d\\n", ret);
return 0;
}
gets()函数用来获取键盘上输入的字符串,这里输了了“This is my life”
- ②函数递归法实现
递归的思想即自己调用自己,化复杂问题为简单问题。
假设现在求字符串“ABCDEFG”的长度,递归的思想即调用自己求“BCDEFG”的长度,无限调用自己,“CDEFG”、“DEFG”……,直到最后不再满足调用条件。
int my_strlen2(const char*str)
{
if (*str)
{
return 1+my_strlen2(++str);
}
return 0;
}
int main()
{
char arr[20];
gets(arr);
int ret = my_strlen2(arr);//2.递归
printf("%d\\n", ret);
return 0;
}
递归演示如下:
二、strcpy
strcpy | —————————— |
---|---|
参数类型 | (char * destination , const char * source) |
返回类型 | (char*) |
功能 | 拷贝源字符串到目标空间 |
- 源字符串必须以 ‘\\0’ 结束。
- 会将源字符串 ‘\\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。(非常量字符串)
- 类似于memcpy。
strcpy处理的对象是字符串类型,可以用char*类型的指针解引用操作,拷贝源字符
为了增加代码的安全性,引入了assert函数,用来判断目标地址与源地址是否有效
void my_strcpy(char *dest, const char* src)
{
assert(dest&&src);
char* ret=dest;
while (*src && (*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[50];
char arr2[20];
gets(arr1);
gets(arr2);
my_strcpy(arr1, arr2);
printf("%s\\n", my_strcpy(arr1,arr2));
return 0;
}
my_strcpy函数内部代码简洁高效,当然不熟悉的也可写的稍微复杂些,如下:
char* my_strcpy(char *dest, const char* src)
{
assert(dest&&src);
char* ret = dest;
while (*src)
{
*dest=*src;
dest++;
src++;
}
*dest = *src;
return ret;
}
代码演示如下:
三、strcmp
strcmp | —————————— |
---|---|
参数类型 | (const char* str1 , const char* str2) |
返回类型 | int |
功能 | 比较两个字符串 |
- 第一个字符串大于第二个字符串,则返回大于0的数字。
- 第一个字符串等于第二个字符串,则返回0。
- 第一个字符串小于第二个字符串,则返回小于0的数字。
- 字符串比较的实质是比较对应字符的ASCII码值。
如果两个字符串长度相等,字符串中每个字符的ASCII码值均相同,则返回0
代码如下:
int my_strcmp(const char*str1, const char*str2)
{
assert(str1&&str2);
while (*str1 == *str2 )
{
if (*str1 == *str2&&*str1=='\\0')
{
return 0;
}
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[50];
char arr2[50];
int n = 0;
gets(arr1);
gets(arr2);
int ret1=my_strcmp(arr1, arr2);
if (ret1 == 0)
{
printf("俩字符串相同\\n");
}
else if (ret1 > 0)
{
printf("字符串arr1大\\n");
}
else
{
printf("字符串arr2大\\n");
}
return 0;
}
以上是关于C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现的主要内容,如果未能解决你的问题,请参考以下文章
C语言学习字符串操作函数——————>strlen strcpy strcmp 详解与手动实现