网友代码:
#include <stdio.h>
#include<string.h>
int my_strlen(const char* str)//寻找结束符号 找到返回索引
{
int i;
for (i = 0;; i++)
if (str[i] == '\0') break;
return i;
}
char* my_strcat(char* destination, const char* source, int buffer)
{
int des_len = my_strlen(destination);
int source_len = my_strlen(source);
if (buffer <= des_len + source_len + 1) {
if (buffer <= des_len + 1) {
return destination;
}
else {//不够存放两个参数的空间 但可以存放第二个参数的部分字符
int i, j;
for (i = des_len, j = 0; i < buffer - 1; i++, j++)
{
destination[i] = source[j];
}
destination[i] = '\0';
}
}
else {//足够存放a和b
int i, j;
for (i = des_len, j = 0; i < des_len + source_len; i++, j++)//这里用i做判断
//实际条件是第二个参数的长度 我这里是直接用j做判断
{
destination[i] = source[j];
}
destination[i] = '\0';
}
return destination;
}
void testMyStrCat()
{
char a[50] = "hello ";
char b[] = "what is your name?";
printf("length a:%d\n", my_strlen(a));
printf("length b:%d\n", my_strlen(b));
printf("sizeof(a):%d\n ", sizeof(a));
my_strcat(a, b, sizeof(a));
printf("连接后的字符串:%s%d", a, my_strlen(a));
}
int main()
{
testMyStrCat();
}
这位大佬考虑了空间充足,不足以及部分充足的情况 我也是研究学习了一下
不足直接返回参数1的字符串就ok 充足的话进行拼接 如果空间不足以拼接参数1和2 但是却>参数1的字符数 就可以通过空间-1的数量把参数2的字符拼接过来 可以说是考虑的十分周全。
下面是我写的代码:
#include <stdio.h>
#include <string.h>
int main()
{
//手写一个strcat函数
char sou[20] = "hello";
char des[] = "world";
int i = 0;
while (sou[i]!='\0')
{
i++;
}
for (size_t j = 0; j < strlen(des); j++)
{
sou[i] = des[j];
i++;
}
printf("%s", sou);
}
说一下不足自省
1.如果我的参数2太大的话 程序直接b掉 没什么好说的!!
2.当然部分拷贝我觉得既然用到strcat就肯定是要把两个字符串完全拼接在一起 但是这种严谨的思路还是很值得我们这种菜鸟学习的。
我也是照着大佬的源码修改了一下
#include <stdio.h>
#include <string.h>
int main()
{
//手写一个strcat函数
char sou[10] = "hello";
char des[] = "my name is cvpotato666666666666666666666666666666666666666666666666666666";
int i = 0;
int j = 0;
if (sizeof(sou) < strlen(sou) + strlen(des) + 1)
{
if (strlen(sou) < sizeof(sou))
{
for (i = strlen(sou); i < sizeof(sou) - 1; i++)
{
sou[i] = des[j];
j++;
}
printf("%s\n", sou);
}
else
{
printf("%s\n", sou);
return 0;
}
}
else
{
for (size_t j = 0; j < strlen(des); j++)
{
sou[i] = des[j];
i++;
}
printf("%s", sou);
}
}
strlen函数
返回一个整型(字符串的长度 不包括\0
)
#include <stdio.h>
int my_strlen(char* str)
{
int i = 0;
while (str[i] != '\0')
{
i++;
}
return i;
}
int main()
{
char str1[20] = "hello";
printf("%d\n", my_strlen(str1));
}
strcpy函数
仿写了strcpy函数 与系统函数不一样的是 本函数对于缓存区不够的情况下 可以拷贝部分函数(其实是鸡肋 本来strcpy就是要全部拷贝) 但也算是仿写了strcpy_s 一个较为安全的
以下是我的代码
#include<stdio.h>
#include<string.h>
#pragma warning (disable:4996)
char* my_strcpy(char* des, char* sou,int mem)
{
int cpynumberd = strlen(des);
int cpynumbers = strlen(sou);
printf("mem = %d\n", mem);
int i = 0;
if (mem> cpynumbers+1)
{
for (i; i < cpynumbers; i++)
{
des[i] = sou[i];
}
des[i] = "\0";
return des;
}
else if (mem<= cpynumbers+1)
{
for (i = 0; i < mem-1; i++)
{
des[i] = sou[i];
}
des[i] = '\0';
return des;
}
}
int main()
{
char str1[5] = "hell";
printf("sizeof str1 = %d\n", sizeof(str1));
char str2[] = "fuck";
printf("my_strcpy = %s\n",my_strcpy(str1, str2,sizeof(str1)));
printf(" strcpy = %s\n", strcpy(str1, str2));
strcpy_s(str1, sizeof(str1), str2);
printf(" strcpy_s = %s\n", str1);
}
网友代码:
#include <stdio.h>
#include <string.h>
char *mystrcpy(char* dest,const char* src)
{
size_t i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i]='\0';
return dest;
}
int main()
{
char name[21];
memset(name,0,sizeof(0));
mystrcpy(name,"xiaoqiu");
printf("strlen=%d\n",strlen(name)); // 7
printf("sizeof=%d\n",sizeof(name)); // 21
return 0;
}
通过i(参数2字符串的长度赋值给字符串1) 前提是字符串1的空间必须足够存放字符串2 否则会崩溃
strncpy函数
根据需要拷贝参数2字符串的固定字符
如果固定字符数量>参数1的空间则会崩溃
如果固定字符数量>参数2的字符串大小 则函数会把参数2的字符串拷贝到参数1的字符串并且多余的地用\0
补齐
代码如下:
#include<stdio.h>
#include<string.h>
#pragma warning (disable:4996)
int my_strlen(char*str)
{
int i = 0;
while (str[i]!='\0')
{
i++;
}
return i;
}
char* my_strncpy(char*des,char*sou,int n)
{
int len_sou = my_strlen(sou);
int memdes = sizeof(des);
if (n<=len_sou)//要拷贝的字符小于源字符串
{
for (size_t i = 0; i < n; i++)
{
des[i] = sou[i];
}
return des;
}
else if (n > len_sou)//要拷贝的字符数量大于源字符串
{
for (size_t i = 0; i < n+1; i++)
{
des[i] = sou[i];
if (i== len_sou)
{
for (size_t j = i; j < n; j++)
{
des[j] = '\0';
}
break;
}
}
return des;
}
}
int main()
{
char str[50] = "hello424244242424422";
char str2[] = "fuck";
my_strncpy(str, str2, 20);
//strncpy(str, str2, 20);
printf("%s\n", str);
}
strcmp仿写
函数是通过比较字符串的每个对应的字符(根据ascll表)
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdio.h>
int my_strcmp1(char*str,char*str1)
{
int i = 0;
for (i; str[i] != 0 && str1[i] != 0; )
{
if (str[i] == str1[i])
{
i++;
contine;
}
if (str[i] > str1[i])
{
return str[i] - str1[i];
}
else
{
return str[i] - str1[i];
}
}
return str[i]- str1[i];
}
int main()
{
char str[20] = "hello";
printf("str[16] = %c\n", str[16]);
char str1[] = "hello";
int ret = my_strcmp1(str, str1);
printf("%d\n", ret);
if (ret>0)
{
printf("参数1>参数2");
}
else if(ret < 0)
{
printf("参数1<参数2");
}
else
{
printf("参数1==参数2");
}
}
网友代码学习:
int mystrcmp(const char *p,const char *q){
while(*p==*q && *p != '\0'){
p++;
q++;
}
return *q-*p;
}
strchr函数
表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。
本来我是用数组写的 想着没写到指针 能不用就尽量不用指针
char* my_strchri(char* str, int c)
{
int i = 0;
while (str[i]!=0)
{
if (str[i]==c)
{
break;
}
i++;
}
int length = strlen(str);
int cout = i;
int j = 0;
char ret[5] = { 0 };
for (j; j < length- cout; j++)
{
ret[j] = str[i];
i++;
}
ret[j] = '\0';
return &ret;
}
也可以实现strchr的效果,但是在计算字符处于第几个字符时,就会出现错误
两个字符长度相减+1就是字符的位置 很明显上面两个值不太对 但是取回来的字符串是对的 不知道什么情况
以下是我用指针写的代码:
char* my_strchr(char* str, int c)
{
while (*str != NULL)
{
if (*str == c)
{
return str;
}
else
{
str++;
}
//寻找字符位置
}
return NULL;
}
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/74/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!