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. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  2. win7升级win10

    win7的系统看起来不是特别爽,还是win10用得顺手. win7升级win10: https://jingyan.baidu.com/article/066074d60391e2c3c31cb04e ...

  3. Idea必知必会

    声明:此文章根据后续用的越来越多,将会不断补充,之所以以链接的形式,是因为不想在这种使用层面上重复造轮子,写很多重复文章,后续我打算写一些更深入的文章. idea常用操作: idea如何Debug调试 ...

  4. Visual Studio 调试系列5 检查变量(使用自动窗口和局部变量窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 在调试时,“自动变量”和“局部变量”窗口会显示变量值. 仅在调试会话期间,这两个窗口才可用. “自动变量”窗口显示当前断点周围使用的变量. “局 ...

  5. java8 HashMap源码 详细研读

    HashMap原理 目的: 单纯分析和学习hashmap的实现,不多说与Hashtable.ConcurrentHashMap等的区别. 基于 jdk1.8 在面试中有些水平的公司比较喜欢问HashM ...

  6. 第25课 std::thread对象的析构

    一. 线程的等待与分离 (一)join和detach函数 1. 线程等待:join() (1)等待子线程结束,调用线程处于阻塞模式. (2)join()执行完成之后,底层线程id被设置为0,即join ...

  7. maven setting 配置仓库,pom.xml中repository不起作用

    问题描述 最近做java项目,需要使用公司自己搭建的maven仓库,但是有些包公司的仓库中没有,导致下载失败. 项目环境 jdk:1.8 maven:3.5 问题原因分析 maven的setting文 ...

  8. Java学习清单

    转自: csdn/zuochao_2013/article/details/76795164   ·   Java基础部分 *Java基础才是重中之重,只有基础打牢了,学习各种框架才能游刃有余. 1, ...

  9. 【leetcode】字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

  10. WPF程序集资源

    WPF会将引用到的资源如图片.BAML文件等编译成二进制数据嵌入到已经编译了的程序集中. 下图是一个反编译后的程序目录结构: 那么,如何向项目中添加资源? 向项目中添加文件 设置生成操作(Build ...