技术标签: strcat c语言 memcpy memmove strstr
三种方式实现strlen
函数使用方法
char* str = "I am the best!";
printf("%d\n", strlen(str));
模拟实现
①指针-指针
#pragma warning (disable:4996)
#include<stdio.h>
int MyStrlen(char* p)
{
char* s = p;
while (*s != '\0')
{
s++;
}
return s-p;
}
int main()
{
char* a = "Lilan is my girl!";
printf("%d\n", MyStrlen(a));
return 0;
}
②递归
#include<stdio.h>
int MyStrlen(char* str)
{
if (*str == '\0')
return 0;
return 1 + MyStrlen(str + 1);
}
int main()
{
char* str1 = "lilan is cute!";
printf("%d\n", MyStrlen(str1));
return 0;
}
③计数器
#include<stdio.h>
int MyStrlen(char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char *str = "Lilan is cute!";
printf("%d\n", MyStrlen(str));
return 0;
}
strcpy
函数使用方法
char *strcpy( char *dest, const char *src );
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void MyStrcpy(char *str1, char *str2)
{
for (int i = 0;; i++)
{
*(str2 + i) = *(str1 + i);
if (*(str1+i) == '\0')
break;
}
}
int main()
{
char str1[999];
char str2[999];
scanf("%s", str1);
MyStrcpy(str1,str2);
printf("复制后str2的内容为:%s\n", str2);
return 0;
}
strcmp
函数使用方法
int strcmp( const char *string1, const char *string2 );
//返回值为int类型
//< 0 string1 smaller than string2
//= 0 string1 等于 string2
//> 0 string1 bigger than string2
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<assert.h>
int MyStrcmp(char *str1, char *str2)
{
assert(str1&&str2);
if (str1 == NULL)
return -1;
if (str2 == NULL)
return 1;
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
return 1;
else
{
return -1;
}
}
int main()
{
char* str1 = "azcd";
char* str2 = "afcd";
printf("%d\n", MyStrcmp(str1, str2));
return 0;
}
strcat(字符串拼接)
函数使用方法
char *strcat( char *dest, const char *src );
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrcat(char *dest,char *src)
{
char *p = dest;
while (*dest != '\0')
{
dest++;
}
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return p;
}
int main()
{
//注意这里不能是指针,字符串放在只读区,不能修改
//数组形式是对内存的一份拷贝
char dest[20] = "bit";
char *src = "hello";
MyStrcat(dest, src);
printf("%s\n", dest);
return 0;
}
strtok(字符串分隔函数)
函数使用方法
char *strtok( char *str, const char *strDelimit );
//str目标字符串
//strDelimit 一个或多个分隔符
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
int main()
{
char str[] = "2000.08.01/lkl";
char* p = strtok(str, "./");
while (p != NULL)
{
printf("%s\n", p);
p = strtok(NULL, "./");
}
return 0;
}
strstr(在主串中寻找子串)
函数使用方法
char *strstr( const char *string1, const char *string2 );
//在string1中寻找string2;
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
char* MyStrstr(char* str1, char* str2)
{
char* start = str1;
while (*start != '\0')
{
char* s1 = start;//每次都从start开始
char* s2 = str2; //每次从头开始
while (s1 && s2 && *s1 == *s2)
//主串子串相同,就往后加,但不能是\0
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return start;
}
start++;//不一样之后主串往后加一
}
return NULL;
}
int main()
{
char *str1 = "likunlong";
char* str2 = "kun";
printf("%s\n", MyStrstr(str1, str2));
return 0;
}
memcpy(内存拷贝函数)
函数使用方法
void *memcpy( void *dest, const void *src, int count );
//count为所拷贝字节数
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<memory.h>
void* MyMemcpy(void* dest, void* src, int count)
{
void* ret = dest;
while (count != 0)
{
*(char*)dest = *(char*)src;
((char*)dest)++;//++优先级高,给前面带括号
((char*)src)++;
count--;
}
return ret;
}
int main()
{
int arr[] = {
1, 2, 3, 4, 5, 6, 7, 8 };
//MyMemcpy(arr, arr + 2, 16);
MyMemcpy(arr+2,arr,16);
int i = 0;
for (; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
memmove
函数使用方法
void *memmove( void *dest, const void *src, int count );
//count为所移动字节数
模拟实现
#pragma warning(disable:4996)
#include<stdio.h>
void* MyMemmove(void* dest, void* src, int count)
{
void* ret = dest;
if (src > dest)
{
while (count != 0)
{
*(char*)dest = *(char*)src;
((char*)dest)++;//++优先级高,给前面带括号
((char*)src)++;
count--;
}
}
//src<dest的情况,发生内存重叠,从后往前拷贝
else
{
count--;//15次
while (count >= 0)
{
*((char*)dest + count) = *((char*)src + count);
count--;
}
}
return ret;
}
int main()
{
int arr[] = {
1, 2, 3, 4, 5, 6, 7, 8 };
MyMemmove(arr + 2, arr, 16);
int i = 0;
for (; i < 8; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
Public Class Form1 Private Const _UserNameC As String = "Tanker.Z" '常量声明 用 Const Private Const _UserPasswordC As String = "Jereh" Private Const _StringEmptyC As String = "" Di
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出版、作者信息和本声明。否则将追究法律责任。http://blog.csdn.net/topmvp - topmvpThe most up-to-date and comprehensive introductory ASP.NET book youll find on any shelf, Beginning ASP.NET 2
这里放出成功后的打印结果,如想了解转换具体步骤,查看篇博客/home/gqw/anaconda3/envs/tensorflow/bin/python /home/gqw/anaconda3/envs/tensorflow/lib/python3.6/site-packages/tensorflow/models-master/research/object_detection/export_inference_graph.py/home/gqw/anaconda3/envs/tensorflow/li
AcetoneISO:镜像文件挂载软件Adobe Photoshop Album,一个图像组织应用程序 [35]Arora:一款跨平台的开源网页浏览器Autodesk MotionBuilder, 三维角色动画软件Autodesk Maya, 3D建模和动画软件Avidemux, a Free Software program designed for
从软件结构设计,讨论代码的简洁 示例项目Codematicdemo的Asp.net2.0版源码发布免费下载,代码生成器Codematic2.0bate版预览动软:http://www.maticsoft.com/softdown.aspxADO.NET的最佳实践技巧: http://www.maticsoft.com/News.aspx?id=4
/**交换排序算法*冒泡排序*改进的冒泡排序算法 (优点可以降低时间复杂度)*/#include<stdio.h>#include<stdlib.h>void bubble_sort(int *s,int n);//简单的冒泡排序函数void up_bubblesort(int *s,int n);//改进的冒泡排序 可以降低时间复杂度void mai...
spyder 与pyqt5的冲突spyder也是用pyqt5写的,所以在pyqt5行运行Qt程序,支持的qt库要与spyder对应
摘要:本文展示了如何基于nolearn使用一些卷积层和池化层来建立一个简单的ConvNet体系结构,以及如何使用ConvNet去训练一个特征提取器,然后在使用如SVM、Logistic回归等不同的模型之前使用它来进行特征提取。卷积神经网络(ConvNets)是受生物启发的MLPs(多层感知器),它们有着不同类别的层,并且每层的工作方式与普通的MLP层也有所差异。如果你对ConvNets感兴趣,这里...
转载:Eclipse安装插件的三种方式
为什么80%的码农都做不了架构师?>>> ...
一、问题 在进行两台linux机器进行MySQL8.0.13主从配置的时候,配置主从之后,在从库mysql进行显示信息show slave status; 出现了Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60 retries: 1二、分析 在mysql的data目录下,用linux cat命令打开...
python高级应用与数据分析学习笔记 081、ndarray元素数据类型int 类型 float 类型 uint类型 complex类型 string类型 object类型 unicode类型 boolen类型 2、ndarray元素类型转换:使用astype函数a = np.array([1,2,4],dtype=np