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. Circumference of circle

    public class Solution { public static void main(String[] args) { Scanner ip = new Scanner(System.in) ...

  2. css 在一定区域内滚动显示,不修改父级样式

    做项目时,会遇到一些零碎的技术点.记录下来以防忘记 需求:图中圈中的部门是滚动的.不修改父级样式 代码: <div class="right-text-bottom"> ...

  3. 推荐支付宝 Android 专项测试工具SoloPi

    推荐支付宝 Android 专项测试工具SoloPi 1 介绍 SoloPi是一个无线化.非侵入式的Android自动化工具,公测版拥有录制回放.性能测试.一机多控三项主要功能,能为测试开发人员节省宝 ...

  4. JS存取Cookies值

    这里对cookie进行了说明,也介绍了几个方法,但是我要取我存的cookie时取不到,他的方法只是针对存的  名字-值,不涉及键,所以自己写了个方法,来满足我的需求. 封装了简单存取Cookie: / ...

  5. SIFT提取特征

    SIFT特征提取: 角点检测: Morvavec角点检测算子:基于灰度方差的角点检测方法,该算子计算图像中某个像素点沿水平.垂直方向上的灰度差异,以确定角点位置 Harris角点检测算子:不止考察水平 ...

  6. 027 奥展项目涉及的javascipt知识点笔记

    1.获取指定div标签内的所有input标签 let inputs = document.getElementById("inspect-part1").getElementsBy ...

  7. [转帖]Linux date命令的用法(转)

    Linux date命令的用法(转) https://www.cnblogs.com/asxe/p/9317811.html 1.命令:date 2.命令功能:date 可以用来显示或设定系统的日期与 ...

  8. JavaScriptCore在浏览器引擎中的位置

    因为随着JS这门语言的发展,JS的宿主越来越多,有各种各样的浏览器,甚至是常见于服务端的Node.js(基于V8运行). 2.       Webkit 源代码由三大模块组成: 1). WebCore ...

  9. TCP/UDP协议(二)

    面试问题:Tcp/Udp协议是什么,各有什么异同点,各自的使用场景? Tcp协议(传输控制协议) tcp是面向连接的协议,在收发数据之前,必须与对方建立可靠的连接: 三次握手:简单形象通俗描述: 主机 ...

  10. Delphi - TIdFTP 两个重要函数

    TIdFTP 两个重要函数 项目开发过程中发现,直接对于服务器上的文件/路径进行处理,是很危险的事情,因为一旦文件/路径不存在,程序就会抛异常,影响客户体验.所以在对服务器上的文件/路径进行访问之前, ...