1.memcpy函数

memcpy 函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多少个?有一个size变量控制拷贝的字节数;

函数原型:void *memcpy(void *dest, void *src, unsigned int count);

用法:可以拷贝任何类型的对象,因为函数的参数类型是void*(未定义类型指针),也就是说传进去的实参可以是int*,short*,char*等等,但是由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节;

#include <stdio.h>
#include <iostream>
#include <assert.h> using namespace std; /********memcpy()函数原型为:void* memcpy(void* dest, void* src, size_t n); 返回指向dest的空类型指针*********/
//返回void* 类型的原因,是为了使用链式表达,即strlen((char*)(memcpy(dest,src,n)),这样可以直接计算dest的长度,是程序代码更简洁
/****注意void* 指针的使用,即该函数允许传入任何类型的指针数据****/
void* memcpy(void *dest, void *src, size_t n)
{
assert((dest != NULL) && (src != NULL));
char *dest_t = (char*)dest; //转换成字符型一个个复制拷贝,由于函数拷贝的过程是一个字节一个字节的拷贝的,
//所以实际操作的时候要把void*强制转化为char*,
char *src_f = (char*)src; //这样在指针加的时候才会保证每次加一个字节
while (n-- > )
{
*(dest_t++) = *(src_f++);
}
return dest;//void* 一定要返回一个值(指针),这个和void不太一样!函数返回指向dest的指针 } int main()
{
int a[] = { , , };
int *b = new int[];
void *c = memcpy(b, a, * sizeof(int)); //sizeof()可以用类型做参数,也可以传入实际的变量
for (int i = ; i < ; i++) //数组做参数时,不退化为指针,统计的是数组整体占据的内存
{
cout << b[i] << endl;
}
int *temp = (int*)c;
temp++;
cout << endl;
cout << *temp << endl;
return ;
}

注1:与strcpy相比,memcpy并不是遇到'\0'就结束,而是一定会拷贝完n个字节。

2:如果目标数组dest本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。

//memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;

  char a[], b[];

  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。

  strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例:

  char a[], b[];

      strcpy(a,b);

2.strcpy函数

#include <stdio.h>
#include <iostream> using namespace std; /********strcpy()函数原型为:char *strcpy(char* dest, const char *src); 返回指向dest的指针*********/
//返回char* 类型的原因,是为了使用链式表达,即strlen(strcpy(dest,src)),这样可以直接计算dest的长度,是程序代码更简洁 char* strcpy(char *dest, char *src)
{
if(dest == NULL || src == NULL)
return NULL;
char *res = dest;//保存原始dst的首地址
while(*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return res;
} int main()
{
char *src = "hello world";
char *dest = new char;
//strcpy(dest,src);
int len = strlen(strcpy(dest,src));
cout << len << endl;
cout << dest << endl;
return ;
}

3.strcat函数

功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')。

说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。

#include <stdio.h>
#include <iostream> using namespace std; char* strcat(char *dest, char *src)
{
if (dest == NULL)
return NULL;
if (src == NULL)
return dest;
char *head = dest;
while (*dest != '\0')
dest++;
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return head;
} int main()
{
char dest[] = "nihao";
char src[] = "zhouyang";
char *res = strcat(dest, src);
cout << dest << endl;
system("pause");
return ;
}

4.strcmp函数

功能:比较两个字符串大小。

实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着比较第二个字符然后第三个字符等等。无论两个字符串是什么样,strcmp函数最多比较到其中一个字符串遇到结束符'/0'为止,就能得出结果。

返回结果:①str1小于str2,返回负值或者-1(VC返回-1);②str1等于str2,返回0;③str1大于str2,返回正值或者1(VC返回1);

#include <stdio.h>
#include <iostream>
#include <assert.h> using namespace std; /****strcmp原型: int strcmp(const char *str1, const char *str2)*****/
int strcmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
while ((*str1 != '\0') && (*str2 != '\0'))
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
{
if (*str1 > *str2)
return ;
else
return -;
}
}
if (*str1 == '\0' && *str2 == '\0')
return ;
else if (*str1 == '\0' && *str2 != '\0')
return -;
else if (*str1 != '\0' && *str2 == '\0')
return ;
} int main()
{
char *str1 = "";
char *str2 = "";
int res = strcmp(str1, str2);
cout << res << endl;
system("pause");
return ;
}

5.strlen函数

功能:返回字符串的长度。

#include <stdio.h>
#include <iostream>
#include <assert.h> using namespace std; /********strlen()函数原型为:int strlen(const char *src); 返回字符串的长度*********/
size_t strlen(const char *str)
{
assert(str != NULL);
int num = ;
while(*str != '\0')
{
str++;
num++;
}
return num;
} int main()
{
char *str = "";
int temp = strlen(str);
cout << temp << endl;
return ;
}

6.strncpy

功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。

要求:如果n > dest串长度,dest栈空间溢出产生崩溃异常。该函数注意的地方和strcpy类似,但是n值需特别注意。

#include <iostream>
#include <stdio.h> using namespace std; /***string.h,char *strncpy(char *dest, const char *src, size_t n),
把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。**/
char* mystrncpy(char *dest, const char *src, size_t n)
{
if (dest == NULL || src == NULL || n < )
return NULL;
char *res = dest;
while (n--)
{
*dest = *src;
dest++;
src++;
}
*dest = '\0';
return res;
} int main()
{
char *src = "hello world";
char c[];
char *res = mystrncpy(c, src, );
cout << res << endl;
system("pause");
return ; }

7.strstr函数

功能:给出字符串str1, str2,判断str2是否为str1的子字符串,如果是,返回str2在str1中对应的起始地址。

#include <stdio.h>
#include <iostream>
#include <assert.h> using namespace std; /****
函数原型:
extern char *strstr(const char *str1, const char *str2); str1: 被查找目标 string expression to search.
str2: 要查找对象 The string expression to find.
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
****/ const char* strstr(const char *str1, const char *str2)
{
if (str1== NULL || str2 == NULL)
return NULL;
const char *temp = str1;
const char *res = str2;while (*str1 != '\0')
{
temp = str1;
res = str2;
while (*temp== *res){
temp++;
res++;
}
if (*res == '\0')return str1;
str1++; }
return NULL; }
int main()
{
char *src = "";
char *dest = "";
const char *res = strstr(src, dest);
cout << res<< endl;//cout<<重载了,会直接输出字符串内容而不是地址
system("pause");
return ;
}

C语言常用库函数实现的更多相关文章

  1. C语言常用库函数

    一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #include <math.h> 函数原型说明 功能 返回值 说明 int abs( int x) 求整数x的绝对值 计算结 ...

  2. C/C++——C语言常用库函数

    本文转载自:https://blog.csdn.net/qq_36955347/article/details/71511900 一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #inc ...

  3. C语言字符串操作常用库函数

    C语言字符串操作常用库函数 *********************************************************************************** 函数 ...

  4. 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现

    C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...

  5. C语言常用的库文件(头文件、函数库)

    C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...

  6. C++之cmath常用库函数一览

    cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数. cmath中常用库函数: 函数 作用 int abs(int i); 返回整型参数i的绝对值 dou ...

  7. C++常用库函数

    C++常用库函数  转自:http://blog.csdn.net/sai19841003/article/details/7957115 1.常用数学函数 头文件 #include <math ...

  8. 【R】R语言常用函数

    R语言常用函数 基本 一.数据管理vector:向量 numeric:数值型向量 logical:逻辑型向量character:字符型向量 list:列表 data.frame:数据框c:连接为向量或 ...

  9. C语言中库函数strstr的实现

    在C语言中库函数strstr()函数表示在一个字符串str1中查找另一个字符串str2,如果查到则返回str2在str1中首次出现的位置,如果找不到则返回null. char* strstr(char ...

随机推荐

  1. bower安装教程

    进入node.js官网下载相应操作系统的安装文件http://www.nodejs.org/download/ ,windows环境下载msi文件即可 打开下载的文件,一直点击下一步,完成安装 安装完 ...

  2. 《Interest Rate Risk Modeling》阅读笔记——第二章:债券价格、久期与凸性

    目录 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子 第二章:债券价格.久期与凸性 思维导图 瞬时回报率-收益率的例子

  3. Centos6 No CMAKE_CXX_COMPILER could be found

    [1]问题现象 cmake发生异常:如下图所示 [2]问题分析 Centos6 上使用Cmake出现错误 "No CMAKE_CXX_COMPILER could be found.&quo ...

  4. web应急:新闻源网站劫持

    新闻源网站一般权重较高,收录快,能够被搜索引擎优先收录,是黑灰产推广引流的必争之地,很容易成为被攻击的对象.被黑以后主要挂的不良信息内容主要是博彩六合彩等赌博类内容,新闻源网站程序无论是自主开发的还是 ...

  5. [原创]SpringSecurity控制授权(鉴权)功能介绍

    1.spring security 过滤器链 ​ spring security中的除了用户登录校验相关的过滤器,最后还包含了鉴权功能的过滤器,还有匿名资源访问的过滤器链,相关的图解如下: 2.控制授 ...

  6. python 练习题:定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程ax^2+bx+c=0的两个解

    请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0的两个解. 提示: 一元二次方程的求根公式为: x1 = (-b + math.sqrt((b ...

  7. Visual Studio Code创建C#项目

    Visual Studio Code是一个支持跨平台的文本编辑器,同其他文本文本编辑器一样,不但占用磁盘空间小,性能也比较快:近几年由于不断的升级和许多开发者提供大量的插件,它已经成为了一个非常强大的 ...

  8. 如何简单使用tensorboard展示(二)

    我使用tensorboard继续做了标量展示与直方图展示,在一的基础做了拓展,其改写代码如下: import numpy as npimport tensorflow as tfimport rand ...

  9. 【转载】C#中Datatable修改列名

    在C#的数据表格DataTable操作过程中,有时候会遇到修改DataTable数据表格的列名的需求,其实C#中的DataTable的列名支持手动修改调整,可以通过DataTable类的Columns ...

  10. javascript中的12种循环遍历方法1

    1:for循环 let arr = [1,2,3]; for(let i =0;i<arr.length;i++){ console.log(i,arr[i]) } //for循环是js中最常用 ...