长度首限制字符串函数
先看一段代码
#include<stdio.h>
int main()
{
char arr1[5] = "abc";
char arr2[] = "hello frost";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
结果:崩溃
解决问题
(一)
strncpy函数:
char* strncpy(char* strDest, const char* strSource, size_t count);
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[10] = "abcdefs";
char arr2[] = "hello frost";
strncpy(arr1, arr2,3);
printf("%s\n", arr1);
return 0;
}
(二)
strncat函数 追加
char *strncat( char *strDest, const char *strSource, size_t count );
#include<stdio.h>
#include <string.h>
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";
strncat(arr1, arr2, 7);
//7>5 还是world
printf("%s", arr1);
//追加过去之后主动放了一个\0
return 0;
}
(三)
strncmp函数
int strncmp(const char* string1, const char* string2, size_t count);
#include<stdio.h>
#include <string.h>
int main()
{
const char* p1 = "abcdef";
const char* p2 = "abcqwer";
int ret = strcmp(p1, p2);
printf("%d\n",ret);
int a = strncmp(p1, p2, 4);
printf("%d\n", a);
return 0;
}
(四)
strstr函数:找字符串的子串
char* strstr(const char* string, const char* strCharSet);
有 -返回d的地址 没有返回-空指针
#include<stdio.h>
#include <string.h>
int main()
{
char* p1 = "abcdefghi";
char* p2 = "def";
char* ret = strstr(p1, p2);//接受地址
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
//结果:defghi
return 0;
}
my_strstr的实现
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 && p2);
char* s1 = p1;
char* s2 = p2;
char* cur = (char*)p1;//记录有可能匹配成功的位置
if (*p2 == '\0')//" "空的
{
return (char*)p1;//p1受const保护,强制类型转换使cur接受保护
}
while (*cur)
{
s1 = cur;
s2 = (char*)p2;
while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;//找到了
}
if (*s1 = '\0')
{
return NULL;
}
//提前终止查找
cur++;
}
return NULL;//找不到子字符串
}
int main()
{
char* p1 = "abbcdef";
//char* p1 = "abcdefghi";
char* p2 = "bbc";
char* ret = my_strstr(p1, p2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}