目录
🧃求字符串长度
🍕strlen函数——测量字符串长度的函数
size_t strlen ( const char * str );
1.字符串已经'\0'作为结束标志,strlen函数返回的是'\0'前面出现的字符个数,不包含‘\0’。
🧡💛💚💙💜
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "xiaoyan";
char str2[] = { 'x','i','a','o' };//str2没有'\0',故结果为随机值
char str3[] = { 'x','i','a','o','\0' };
printf("%d\n", strlen(str1));//7
printf("%d\n", strlen(str2));//19随机值
printf("%d\n", strlen(str3));//4
}
2.strlen返回值为size_t,无符号类型(注意)
🔴🟠🟡🟢🔵
#include<stdio.h>
#include<string.h>
int main()
{
if (strlen("yan") - strlen("xiao") > 0)//strlen返回值为无符号类型
{
printf(">\n");
}
else
{
printf("<=\n");
}
printf("%u\n", strlen("yan") - strlen("xiao"));//用无符号类型进行打印
}
运行结果为:
🚗strlen模拟实现
三种方法
//计数器方式
int my_strlen(const char * str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
//不能创建临时变量计数器
int my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}
//指针-指针的方式
int my_strlen(char *s)
{
char *p = s;
while(*p != ‘\0’ )
p++;
return p-s;
}
🧃长度不受限制的字符串函数
🍕strcpy函数——字符串复制函数
形式为:strcpy(目标字符串,源字符串),作用:将源字符串复制到目标字符串中.
注意事项:源字符串以'\0'结束。会将源字符串中的'\0'拷贝到目标空间。所以要求目标空间必须是可变的且足够大,以确保能够存放源字符串。
❤🧡💛💚💙
#include <stdio.h>
#include <string.h>
//strcpy简单使用
int main()
{
char arr1[20] = {0};
char arr2[] = "xiaoyan";
strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
运行结果:
🧡💛💚💙💜
#include <stdio.h>
#include <string.h>
//通过调试细节观察
int main()
{
char arr1[6] = "xxxxx";
char arr2[] = "yan";
strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
🚗strcpy的模拟实现
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
while(*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char* arr2 = "hhh";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
🍕strcat——字符串追加函数
char *strcat( char *strDestination, const char *strSource );
strcat函数将strSource追加到strDestination,并以一个空字符结束结果字符串。strSource的起始字符将覆盖结束strDestination的空字符。
源字符串必须以'\0'结尾;
目标函数必须有足够大的空间,能容下源字符串的内容;
目标空间必须可修改;
#include<stdio.h>
#include<string.h>
int main()
{
//简单看一下效果
char arr1[20] = "xiao";
char arr2[] = "yan";
strcat(arr1, arr2);//字符串追加(链接)
printf("%s", arr1);
return 0;
}
运行结果为,为了看出到底是如何追加的我们将char1改成“xiao\0xxxxxxx”,进行调试看一下
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "xiao\0xxxxxxx";//更换后
char arr2[] = "yan";
strcat(arr1, arr2);//字符串追加(链接)
printf("%s", arr1);
return 0;
}
调试的结果如下:可以看出'\0'被y覆盖。可以将strcat函数看成两步,第一步:找到目标字符串的'\0',源字符串追加过去并且包含'\0'.
🚗模拟实现stract
char* my_stract(char* dest, char* src)
{
assert(dest&&src);
char* ret = dest;
while (*dest)
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = "bit";
my_stract(arr1, arr2);
printf("%s", arr1);
return 0;
}
🍕strcmp——字符串比较函数
int strcmp( const char *string1, const char *string2 );
标准规定第一个字符串大于第二个字符串,则返回大于零的数字,相等则返回0;小于返回小于零的数。那么是如何进行比较的呢,以“a”和“b”来说,在字典中a排在b的前面a就比b大,返回大于零的数;对于“ae”和“ac",由于第一个字母是一样的,所以我们继续比较下一个,因为e在c的后面,所以返回小于零的数。
#include<stdio.h>
#include<string.h>
int main()
{
int ret = strcmp("abc", "abe");
printf("%d\n", ret);
return 0;
}
运行结果为
🚗模拟strcmp
//模拟strcmp
my_strcmp(const char*s2,const char*s1)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == 0)
{
return 0;
}
s1++;
s2++;
}
return *s1 - *s2;
}
int main()
{
char arr1[] = "abd";
char arr2[] = "abc";
int ret = strcmp(arr1, arr2);
if (ret > 0)
{
printf(">\n");
}
else if(ret == 0)
{
printf("==\n");
}
else
{
printf("<\n");
}
printf("%d", ret);
return 0;
}
🧃长度受限制字符串
🍕strncpy——拷贝num个
- char * strncpy ( char * destination, const char * source, size_t num );
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
- 拷贝num个字符从源字符串到目标空间
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "gh";
strncpy(arr1, arr2, 1);
printf("%s", arr1);//输出结果gbcdef
return 0;
}
🍕strncat——追加num个
- char * strncat ( char * destination, const char * source, size_t num );
- Appends the first num characters of source to destination, plus a terminating null-character.
- If the length of the C string in source is less than num, only the content up to the terminatingnull-character is copied
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = "abcdef\0xxxxxx";
char arr2[] = "ghijk";
strncat(arr1, arr2, 5);
printf("%s", arr1);//输出结果为abcdefghijk
return 0;
}
🍕strncmp——比较num个
- int strncmp ( const char * str1, const char * str2, size_t num );
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bcd";
int ret = strncmp(arr1,arr2,3);//arr1和arr2的前三个进行比较
//abc和bcd进行比较,a<b
printf("%d", ret);//a<b返回小于零的数(vs2019下返回-1)
return 0;
}
🧃字符串查找
🍕strstr
- char * strstr ( const char *str1, const char * str2);
- Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part ofstr1
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdefcdeh";
char arr2[] = "cdef";
char*ret=strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到");
}
else
{
printf("%s\n", ret);//cdefcdeh
}
return 0;
}
🚗模拟strstr
char* my_strstr(char* str1, char* str2)
{
char* s1 = str1;
char* s2 = str2;
char* cur = str1;
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1&&*s2&&* s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
return NULL;//找不到
}
int main()
{
char arr1[] = "abcdeqabcdef";
char arr2[] = "cdef";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("找不到子串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}