C语言进阶之旅(12)搞定字符串和内存函数
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言进阶之旅(12)搞定字符串和内存函数相关的知识,希望对你有一定的参考价值。
这篇是如何使用库函数之少写点代码哈哈哈,为啥有库函数呢?,应为这个大家都用,且,频率还高,每次用还要自己实现,麻烦所以就诞生了库函数,方便😏
文章目录
思维导图
字符串函数
strlen求字符串长度
- 计算\\0之前字符的个数
- 详细介绍
strcpy
- 拷贝字符串到目标点
- 就是把字符考到相应的你想要的地方
- 然后返回被改变数组的地址
char* des2 = des;
/*while (*con&&*des)
{
*des = *con;
des++;
con++;
}*/
while (*des++=*con++)
{
;
}
return des2;
}
int main()
{
char arr1[20] = "ABCDE";
char arr2[] = "FGHIJ";
printf("%s",my_strcpy(arr1, arr2));
return 0;
}
strncpy
- 这个是可以指定你考过去的字符
- 和strcpy比起来多了一个限制条件
- 然后返回被改变数组的地址
while (限制条件--)
{
*des = *con;
des++;
con++;
}
strcmp
- 字符串对比
- 每个对应的字符比较比的是ASSIC对应的值
- 字符串相等,返回0,
- 大则返回大于0的数
- 小则返回小于0的数
#include<assert.h>
int my_strcmp(const char *str1,const char* str2)
{
assert(str1&&str2);
while (*str1 == *str2&& *str1&& *str2)
{
str1++;
str2++;
}
if (*str1 - *str2== 0)
{
return 0;
}
else
{
return *str1 - *str2;
}
}
int main()
{
char arr1[] = "ABCDE";
char arr2[] = "CDEBB";
int ret1 = strlen(arr1);
int ret2 = strlen(arr2);
if (ret1 == ret2)
{
int ret = my_strcmp(arr1, arr2);
if (ret != 0)
{
printf("不等于\\n");
}
else
{
printf("等于");
}
}
else
{
printf("不相等\\n");
}
}
strncmp
- 指定长度比较
- 比较自己需要比较的字符串
实现只需要传参的时候多一个限条件,在写个循环条件是限制条件
int my_strcmp(const char *str1,const char* str2,int 限制条件)
{
assert(str1&&str2);
while(x)
while (*str1 == *str2&& *str1&& *str2)
{
str1++;
str2++;
}
if (*str1 - *str2== 0)
{
return 0;
}
else
{
return *str1 - *str2;
}
}
strcat
- 字符串追加
- 前提空间要大
- 从\\0开始改,然后会把arr2(源头)哪里的一直拷贝,\\0也是
char* my_strcat(char* des,const char* sour)
{
assert(des && sour);
char* des2 = des;
while (*des!='\\0')
{
des++;
}
while (*des!=*sour)
{
*des++ = *sour++;
}
return des2;
}
int main()
{
char arr1[20] = "hello \\0########";
char arr2[] = "world";
//strcat(arr1, arr2);
printf("%s",my_strcat(arr1, arr2));
return 0;
}
strncat
- 这个是受限制追加
- 其实和上面一样多一个限制条件,和strncmp实现方法大同小异
strstr
- 找基友函数哈哈哈怎么理解
- 就是在一个字符串中找,另一个字符出是不是他的子串
char* my_strstr(const char *dest,const char *cour)
{
assert(dest && cour);
const char* dest2 = dest;
const char* cour2 = cour;
if (*cour == '\\0')
{
return (char*)dest;
}
while (*dest2)
{
dest = dest2;
cour2 =cour ;
while (( *dest == *cour2)&&*dest&&*cour2)
{
dest++;
cour++;
}
if(*dest==*cour&&*dest!='\\0')
return (char*)dest2;
dest2++;
}
return NULL;
}
int main()
{
char arr1[] = "ABBC";
char arr2[] = "CCC";
char *ret =my_strstr(arr1,arr2);
if (ret != NULL)
{
printf("是该字符的子串");
}
else
{
printf("不是该字符的子串");
}
return 0;
}
类似stcmp,却又不一样,他也是一一对比, 但是区别是,他要多次比较
strtok
- 字符串切段
- 就是咋找到相应的字符进行切段
- 切段其实就是给那个地方放上一个\\0;
详细介绍
中文版
英文
strerror
- 翻译错误信息(erron)
例子:
打开文件夹用的文件
int main() {
FILE* pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
printf("该错误是: %s\\n", strerror(errno));
//errno: Last error number
return 0;
}
应为我在文件中就没有创建这个文件
perroe
- 直接翻译错误加打印,这不比方便面还方便吗哈哈
- 输入那个需要打开的文件,即可😏
字符操作函数
- 这个我感觉用处不是特别大,而且用法也简单
内存函数
- 上面的那些函数用处局限吗
- 所以老大哥内存函数,管你是啥,都是老子小弟
memcpy
- 和strcpy差不多,也是拷贝
- 但是不一样的是实现方法
- 要想通用还得用我char
- 比较他只有一个字节,可谓小巧精干呀
#include<stdio.h>
#include<string.h>
#include<assert.h>
//void* my_memcpy(void* dest, const void* sour, size_t sz)
//{
// assert(dest&&sour);
// void* destm = dest;
// while (sz--)
// {
// *(char*)dest = *(char*)sour;
// dest=(char*)dest + 1;
// sour=(char*)sour + 1;
//
// }
// return destm;
//}
void* my_memcpy(void* dest, const void* sour, size_t sz)
{
assert(dest && sour);
void* destm = dest;//返回值
char* destt = (char*)dest;
char* sourr = (char*)sour;
while (sz--)
{
*destt++ = *sourr++;
}
return destm;
}
int main()
{
int arr1[10] = { 1,2,3,4,5 };
int arr2[] = { 6,7,8,9,10 };
int sz = sizeof(arr2);
my_memcpy(arr1, arr2, 20);//内存拷贝
return 0;
}
这里需要注意的是强制类型转换和后置加加,强制类型转换他是零时的,你给他++他又没有那个性质了,就是类似
buff时间到
了的感觉,还有优先级考虑的话++的优先级比强制类型转换的高
memcmp
- 内存比较
- 已经是和strcmp差不多
- 实现也是和也是,但是是一个字节一个字节的比
- 看不懂这里的比较的话请看数据存储
memmove
- 这个是一拷贝自己的
- 模拟实现,这里有俩个问题需要解决
- 怎么考
- 从前往后,还是从后往前
- 情况1
源头在后
先cpy后面的,那么那个位置就可以随意改了,如果从前往后的话,那么后面的数据就被改变了
- 情况2:
源头在前
void* my_memmove(void *dest,void *sour,size_t num)
{
assert(dest&&sour);
void* destm = dest;
char* destt = (char*)dest;
char* sourr = (char*)sour;
while (num--)
{
if (destt < sourr)//地址比较
{
*destt++ = *sourr++;
}
else if(destt >sourr)
{
*(destt + num) = *(sourr + num);//地址在减少的时候他们也在减少
}
else
{
*destt++ = *sourr++;
}
}
return destm;
}
void print(int arr[],int sz)
{
int i = 0;
for ( i = 0; i <sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8, };
int sz = sizeof(arr1) / sizeof(arr1[0]);//元素个数
my_memmove(arr1+3, arr1,20);
print(arr1,sz);
printf("\\n");
my_memmove(arr1, arr1 + 3, 20);
print(arr1, sz);
printf("\\n");
return 0;
}
总结
- 这些函数需要多用哦~~
- 用多了就知道了
- 温故知新,嗨~~
如果有错误请直接提出,评论区,私信,qq(1696912943),误人子弟可不好🤯
持续更新中……………………
以上是关于C语言进阶之旅(12)搞定字符串和内存函数的主要内容,如果未能解决你的问题,请参考以下文章
我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类
我的C/C++语言学习进阶之旅转载:实现一个在JNI中调用Java对象的工具类
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段