1.strlen函数(求字符串长度)
size_t strlen (const char * str );
(1)使用
#include <stdio.h>
#include<string>
int main()
{
const char *str = "luckly";
int len = strlen(str);
printf("%d\n", len);
return 0;
}
//5
(2)自行实现
法一:计数器
\0不算入长度内,所以可以定义一个count,遇到\0停止即可
#include <stdio.h>
#include<assert.h>
int Mystrlen(const char*str)
{
assert(str != NULL);
int count = 0;
while(*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
const char *str = "luckly";
int len = Mystrlen(str);
printf("%d\n", len);
return 0;
}
法二:通过指针
unsigned int Mystrlen(const char*str)
{
assert(str != NULL);
const char *p = str;
while (*p != '\0')
{
*p++;
}
return p - str;//用无符号接收,以免算出来为负
}
int main()
{
const char *str = "luckly";
unsigned int len = Mystrlen(str);
printf("%u\n", len);
return 0;
}
2.strcpy函数(拷贝)
char* strcpy(char *destination,const char *source);
(1)使用
#include<string.h>
int main()
{
char *str1 = "abcde";
char str2[10] = "hello";
char *ret = strcpy(str2, str1);
printf("%s", ret);
return 0;
}
(2)自行实现
#include <stdio.h>
#include<assert.h>
#include<string.h>
char*MyStrcpy(char * dest, const char * str)
{
char *p = dest;
assert(dest != 0 && str != 0);
while (*str != '\0')
{
*dest = *str;
dest++;
str++;
}
*dest = '\0';
return p;
}
int main()
{
char * str1 = "abcdef";
char str2[10] = "hello";//注意!!一定为数组啊
char *ret= MyStrcpy(str2, str1);
printf("%s", ret);
return 0;
}
简化版:
char*MyStrcpy(char * dest, const char * str)
{
char *p = dest;
assert(dest && str);//即dest != 0 && str != 0
while (*dest++ = *str++);//\0=\0,为0,为假,循环结束
return p;
}
int main()
{
char * str1 = "abcdef";
char str2[10] = "hello";//注意!!一定为数组啊
char *ret = MyStrcpy(str2, str1);//有返回值为了之后求长度之类
printf("%s\n", ret);
printf("%s\n", str2);
printf("%d\n", strlen(MyStrcpy(str2, str1)));
printf("%d\n", strlen( ret));
return 0;
}
3.strcat字符串拼接
(1)使用
int main()
{
char * str1 = "abcdef";
char str2[20] = "hello";//注意!!一定为数组啊
/*char *ret= strcat(str2, str1);
printf("%s|n", ret);
printf("%s\n", str2);*/
printf("%d\n", strlen(strcat(str2, str1)));
return 0;
}
(2)自行实现
先让str1走到\0,再把str2赋给\0开始,最后返回初始位置
#include <stdio.h>
#include<assert.h>
#include<string.h>
char * MyStrcat(char * dest, const char * str)
{
assert(dest&&str);
char *p = dest;
while (*dest != '\0')
{
*dest++;
}
//*dest=\0;
while (*dest++ = *str++)
;//空语句
return p;
}
int main()
{
char * str1 = "abcdef";
char str2[20] = "hello";
char *ret = MyStrcat(str2, str1);
printf("%s\n", ret);
return 0;
}
4.strcmp字符串比较
int strcmp(const char*str1,const char*str2)
第一个字符串大于第二个字符串,返回大于0的数字; 1
第一个字符串相等第二个字符串,返回0;
第一个字符串小于第二个字符串,返回小于0的数字; -1
(遇到第一个不同的就开始比较)
(1)使用
int main()
{
char*str1 = "abcde";
char*str2 = "abgde";
int ret = strcmp(str1, str2);//用 int
printf("%d\n", ret);// -1
return 0;
}
(2)自行实现
#include <stdio.h>
#include<assert.h>
#include<string.h>
int MyStrcmp(const char*dest, const char*src)
{
assert(dest&&src);
while (*dest == *src)
{
if (*src == '\0')
{
return 0;
}
*dest++;
*src++;
}
if (*dest > *src)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
char*str1 = "abgde";
char*str2 = "abcde";
int ret = MyStrcmp(str1, str2);
printf("%d\n", ret);
return 0;
}
5.strncpy拷贝n个字符
int main()
{
char*str1 = "abcde";
char str2[10] = { 0 };
char * ret = strncpy(str2, str1,3);
printf("%s\n", ret); //打印abc
return 0;
}
6.strncat拼接n个字符
int main()
{
char*str1 = "abcde";
char str2[10] = "hello";
char * ret = strncat(str2, str1,3);
printf("%s\n", ret);
return 0;
}
7.strncmp比较前n个
int main()
{
char*str1 = "abcde";
char *str2 = "anllo";
int ret=strcmp(str1, str2,2);
printf("%d\n", ret);
return 0;
}
8.strstr查找子串在主串中的位置
char * strstr(const char *,const char *);
(1)使用
int main()
{
char * str1 = "ababcabcde";
char * str2 = "abc";
char * ret = strstr(str1, str2);
printf("%s\n", ret);
return 0;
}
(2)自行实现
#include <stdio.h>
#include<assert.h>
#include<string.h>
const char * Mystrstr(const char *str1, const char*str2)
{
assert(str1 != NULL&&str2 != NULL);
while (*str1 != '\0')
{
const char *s1 = str1;
const char *s2 = str2;
while (*s1 == *s2&&*s1 != '\0'&& *s2 != '\0')
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return str1;
}
str1++;
}
return NULL;
}
int main()
{
const char * str1 = "ababcabcde";
const char * str2 = "abc";
const char * ret = strstr(str1, str2);
printf("%s\n", ret);
return 0;
}
//类似算法还有:KMP,朴素算法BF
9.memcpy内存拷贝函数
void * memcpy (void *destinnation,const void *source,size_t num)
- 源空间和目标空间可能会有重叠,最好少使用(因此使用memmove函数处理
第一种:
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = {0};
int *p = (int*)memcpy(arr2, arr1, 10 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", p[i]);
}
return 0;
}
第二种:
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = {0};
memcpy(arr1+2, arr1, 4 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
10.memmove
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int arr2[10] = {0};
memmove(arr1+2, arr1, 4 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
11.memcmp内存比较
和strcmp很类似