精华内容
下载资源
问答
  • memcpy与strcpy不同,它是以字节为单位进行拷贝,每次拷贝一个字节,使用时,需要了解要拷贝的字节。同时,因为它是以字节进行拷贝,所以无类型限制,即对任意类型均可以使用,而strcpy专用于字符串。 它的拷贝...

    1. 题目一:不使用库函数,模拟实现内存拷贝函数memcpy的功能。

    分析:

    memcpy与strcpy不同,它是以字节为单位进行拷贝,每次拷贝一个字节,使用时,需要了解要拷贝的字节数。同时,因为它是以字节进行拷贝,所以无类型限制,即对任意类型均可以使用,而strcpy专用于字符串。

    它的拷贝原理与strcpy类似,strcpy以“\0”为结束判断依据,而memcpy以要拷贝的字节数为结束判断依据。

    代码如下:


    例一:将src拷贝到dest中,主函数代码:


    运行结果:


    例二:当希望将src中的后续字符依次前移时,希望得到“xjgqg”时,主函数变为如下:


    运行结果:


    显然,与我们预期一致。

    例三:当希望将src中的字符依次后移时,希望得到“bbxjgq”时,主函数变为如下:

    此时,运行结果为:


    这显然与我们预期的结果不同。此时,memcpy的功能已经不再适用,这里就需要用到memmove。

    2. 题目二:模拟实现内存拷贝函数memmove的功能

    同样是内存拷贝函数,两者之间的区别是什么呢?

    这里,我们分析下两个字符串拷贝的几种情况:src表示源字符串,dest表示目标字符串。(因为dest是目标字符串,所以dest的长度一定大于src的长度)

    1)src的地址小于dest的地址,二者不重叠。

    2)src的地址大于dest的地址,二者不重叠。

    3)src的地址小于dest的地址,二者不重叠。

    4)src的地址小于dest的地址,二者有重叠(包括src完全包含在dest中的情况)。

    如下图:


    在处理前无重叠情况时,memcpy是适用的。再由上述例二,例三知,情形三memcpy也是适用的,而memcpy不适用于情形四。

    而memmove就是用于解决情形四的,更确切的说,它对这四种情形都适用。前三种情形可以用与memcoy相同的方法接解决,

    那么,情形四如何解决呢?

    分析:

    首先,我们需要知道上述例三的结果是如何产生的,在就上图而言,当src向dest拷贝时,a先拷给d,b拷给e,c拷给f,当要将d拷给g时,发现原来的有效d已经被a替代,使之失效 ,所以结果会变为abcabca,与例三的的结果类似。

    其次,知道了出错原因,如何解决呢,上述叙述中,是从左往右拷贝的,这里,我们需要从右往左拷贝,即先拷贝g,依次往左进行,即使后面的拷贝会覆盖g但g已经发挥起作用,已经失效,所以,可以从右往左拷。

    然后,src,dest初始是在字符串开头,那么需要移到右边什么地方呢?这时,就要考虑需拷贝的字节数了,若需拷贝k个字节,则src,dest分别从src+k,dest+k开始,依次往左拷。

    最后,我们考虑下情形四的条件,从图中,可以观察到,src<dest且src+strlen(src)>dest。而其余情形方法与memcpy相同。

    通过分析,代码编写如下:


    对上述例三进行验证:


    运行结果:


    可以看到,结果与预期一致。

    注意:

    在对字符串进行拷贝时,首选strcpy;

    在对内存进行拷贝时,可以选取memmove和memcpy,

    而memmove的功能是兼容memcpy的,在检测字符串是否重叠时,就可以选择memcpy。

    展开全文
  • 控制流程深浅拷贝

    2019-06-19 00:31:47
    基本数据类型四 1.字符串编码 计算机其实是只认识0和1的,我们编写的代码,要...1byte = 8bit # 计算机的最小存储单位 0-255的数值 字符编码的发展史00000000 第一个阶段: 考虑英文ASCII(英文字符/键盘上的所有字...

    基本数据类型四

    1.字符串编码

    计算机其实是只认识0和1的,我们编写的代码,要让计算机认识,中间涉及到字符转换为数字0和1的过程,这个过程实际就是一个字符如何对应一个特定的数字的标准,这个标准就称之为字符编码

    0/1 = 1bit
    1byte = 8bit # 计算机的最小存储单位 0-255的数值

    字符编码的发展史00000000
    第一个阶段:
    考虑英文ASCII(英文字符/键盘上的所有字符)
    ASCII码用一个字节代表一个字符

    第二个阶段:
    各个国家纷纷定制了自己的字符编码
    GBK使用两个字节(2bytes)代表一个字符 2**16-1 65535

    第三个阶段:
    unicode兼容万国语言 使用两个字节(2bytes)代表一个字符

    第四个阶段:
    utf-8:对英文字符1byte表示,中文3bytes

    总结:

    1.为了处理英文字符,产生了ASCII码
    2.为了处理中文字符,产生了GBK
    3.为了处理各国字符,产生了Unicode
    4.为了提高存储和传输性能,产生了utf-8

    重点:python3下字符编码使用情况

    unicode:简单粗暴,所有字符都是2bytes,优点字符–》数字的转换速度快,缺点占用空间大
    utf-8:精准,对不同的字符用不同的长度表示,优点:节省空间,缺点:字符–》数字的转换速度慢

    python3中字符编码实际类型使用
    1.内存中使用的就是unicode,用空间换时间
    2.硬盘中或者网络传输用utf-8,尽可能节省带宽,保证数据传输的稳定性

    编码(encode)和解码(decode)

    编码(encode):将unicode转换为其他指定的编码

    解码(decode):将原编码转换为unicode编码

    2.赋值深浅复制

    1.字符串(数字):在内存中是一次性创建的,不能直接修改,如需修改,需要重新创建
    2.列表等可修改的数据类型:在内存中创建时是以链表的形式创建
    3.字符串、数字:赋值、深浅拷贝都没有意义,因为其永远指向同一个内存地址
    4.列表、元组、字典

    3.bytes和bytearray(字符串,列表)

    4.字符串格式化

    展开全文
  • 如果需要粘贴的是整行为单位那么 p 命令将从光标的下一行开始粘贴; 如果拷贝的是非整行的局部字符串,那么 p 命令将在光标之后开始粘贴。 使用 y 命令实现拷贝: y [数字] motion,类似于 d r 命令用于替换光标...

    vim学习 06——粘贴拷贝替换修改

    使用 p 命令可以将最后一次删除的内容粘贴到光标之后。(大写的 P 则是粘贴到光标之前)

    注意:

    • 如果需要粘贴的是整行为单位那么 p 命令将从光标的下一行开始粘贴;
    • 如果拷贝的是非整行的局部字符串,那么 p 命令将在光标之后开始粘贴。

    使用 y 命令实现拷贝: y [数字] motion,类似于 d

    r 命令用于替换光标所在的字符,做法是先将光标移动到需要替换的字符处,按一下 r 键,然后输入新的字符

    • 在键入 r 命令之前输入数字,表示从光标处开始,将多个字符统一替换为新字符

    R 命令让你一步到位进入替换模式,替换的字符可以使用 Backspace 按键恢复

    修改与替换是不一样的!!!替换不进入插入模式,修改进入插入模式~

    修改与替换是不一样的!!!替换不进入插入模式,修改进入插入模式~

    修改与替换是不一样的!!!替换不进入插入模式,修改进入插入模式~

    使用 c 命令实现修改: c [数字] motion

    按键 含义
    c0 删除光标从当前位置(不包含)到该行行首的所有字符,并进入插入模式
    c^ 同上
    c$ 删除从光标当前位置(包含)到该行行尾的所有字符,并进入插入模式
    cb 删除光标从当前位置(不包含)到单词起始处的所有字符,并进入插入模式
    ce 删除光标从当前位置(包含)到单词结尾处的所有字符,并进入插入模式
    cw 删除光标从当前位置(包含)到写个单词起始处的所有字符,并进入插入模式
    ch 删除光标前边一个字符,并进入插入模式
    cl 删除光标指定字符,并进入插入模式
    cj 删除光标所在行及下一行的所有字符,并进入插入模式
    ck 删除光标所在行及上一行的所有字符,并进入插入模式
    cc 删除光标所在行的字符,并进入插入模式

    转载于:https://www.cnblogs.com/arelive/p/vim-06.html

    展开全文
  • 9.所有的复制操作都是通过“从介质(硬盘)读→写入→从缓存中读出→向介质(硬盘)写入”这几项步骤来完成的,并且这些步骤都是多个线程同时进行的,如果线程之间的协同运作不够完美,那速度就会大打折扣,...
  • //分流段 double n = (100 * 1.0 / step); //每次进度条累加 double m = 0; //累加统计 int spam = 1; //时间间隔 double speed = 0; //拷贝速度 do { DateTime time = DateTime.Now; //文件流操作 ...
  • fread与fwrite实现文件的拷贝

    千次阅读 2019-03-24 11:53:20
    一、函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);...返回:读取成功的完整项,读到EOF或失败返回0 注意:size使用单位字节大小 size_t fwrite(const void *ptr, size_...

    一、函数

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    
    功能:从stream文件中读取nmemb项数据存到ptr,每一项数据size大小
    
    返回:读取成功的完整项数,读到EOF或失败返回0
    
    注意:size使用单位字节大小
    
    
    
    size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *st);
    
    功能:将ptr里的数据写nmemb项到stream文件中,每项size大小
    
    返回:写入成功的完整项数

     

     

    二、测试源码

     

    #include <stdio.h>
    
    #define N 32
    
    int main(int argc, const char *argv[])
    {
    	if(argc < 3)
    	{
    		printf("argument is too less\n");
    		return -1;
    	}
    
    	FILE *fp_r = fopen(argv[1], "r");
    	if(fp_r == NULL)
    	{
    		printf("fp_r fopen error\n");
    		return -1;
    	}
    
    	FILE *fp_w = fopen(argv[2], "w");
    	if(fp_w == NULL)
    	{
    		printf("fp_w fopen error\n");
    		return -1;
    	}
    	char buf[N];
    	int ret = 0;
    
    	while((ret = fread(buf, 1, N, fp_r)) != 0)
    	{
    		fwrite(buf, 1, ret, fp_w);
    	}
    
    	printf("copy ok\n");
    	fclose(fp_r);
    	fclose(fp_w);
    	
    	return 0;
    }
    
    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define  SIZE 1024 * 4 //每次读写4k数据
    
    void menu()
    {
    	printf("================================\n");
    	printf("1 拷贝文件\n");
    	printf("2 清屏\n");
    	printf("3 退出\n");
    	printf("================================\n");
    }
    
    void myCopy()
    {
    	char rPath[256]; //源文件
    	char wPath[256]; //目的文件
    	FILE *rFp = NULL;
    	FILE *wFp = NULL;
    	char buf[SIZE] = { 0 }; 
    	int n = 0;
    
    	printf("请输入源文件:");
    	scanf("%s", rPath);
    
    	printf("请输入目的文件:");
    	scanf("%s", wPath);
    
    	if (strcmp(rPath, wPath) == 0)
    	{
    		printf("源文件和目的文件不能相同\n");
    		return;
    	}
    
    	//只读方式打开源文件
    	rFp = fopen(rPath, "rb");
    	if (rFp == NULL)
    	{
    		perror("fopen rPath");
    		return;
    	}
    
    	//只写方式打开目的文件
    	wFp = fopen(wPath, "wb");
    	if (wFp == NULL)
    	{
    		fclose(rFp);
    		perror("fopen wFp");
    		return;
    	}
    
    	do 
    	{
    		n = 0;
    		//读多少,写多少
    		n = fread(buf, sizeof(char), SIZE, rFp);
    		printf("拷贝:%d\n", n);
    		fwrite(buf, sizeof(char), n, wFp);
    
    	} while (n > 0);
    	printf("拷贝完成\n\n");
    
    	fclose(rFp);
    	fclose(wFp);
    }
    
    int main()
    {
    	
    
    	int cmd;
    
    	while (1)
    	{
    		menu();
    		printf("cmd: ");
    		scanf("%d", &cmd);
    
    		switch (cmd)
    		{
    		case 1:
    			myCopy();
    			break;
    		case 2:
    			system("clear");
    			break;
    		default:
    			exit(0);
    		}
    	}
        
    	return 0;
    }

     

    三、测试结果

     

     

     

    四、关键代码分析

     

    while((ret = fread(buf, 1, N, fp_r)) != 0)
    	{
    		fwrite(buf, 1, ret, fp_w);
    	}

    当返回值不是0时,将每次读取到的数据块通过buf拷贝至待拷贝的文件中,直到读到文件的末尾。

     

    #define  _CRT_SECURE_NO_WARNINGS 
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    
    //直接把内存数据 写入到 文件中
    typedef struct Teacher
    {
    	char name[64];
    	int age ;
    }Teacher;
    
    int my_fwrite(void)
    {
    	int i = 0;
    	FILE *fp = NULL;
    	char *fileName = "./a.data";
    	Teacher tArray[3];
    	int  myN = 0;
    
    	for (i=0; i<3; i++)
    	{
    		sprintf(tArray[i].name, "%d%d%d", i+1, i+1, i+1);
    		tArray[i].age = i + 31;
    	}
    
    	fp = fopen(fileName, "wb");
    	if (fp == NULL)
    	{
    		printf("建立文件失败\n");
    		return -1;
    	}
    	for (i=0; i<3; i++)
    	{
    		myN = fwrite( &tArray[i],sizeof(Teacher) , 1, fp);
    
    	}
    
    	if (fp != NULL)
    	{
    		fclose(fp);
    	}
    
        return 0;
    }
    
     int my_fread(void)
    {
    	int i = 0;
    	FILE *fp = NULL;
    	char *fileName = "./a.data";
    	Teacher tArray[3];
    	int  myN = 0;
    
    	fp = fopen(fileName, "rb");
    	if (fp == NULL)
    	{
    		printf("建立文件失败\n");
    		return -1;
    	}
    	for (i=0; i<3; i++)
    	{
    		myN  = fread(&tArray[i], sizeof(Teacher), 1, fp);
    	}
    
    	for (i=0; i<3; i++)
    	{
    		printf("name:%s, age:%d \n", tArray[i].name, tArray[i].age);
    	}
    
    	if (fp != NULL)
    	{
    		fclose(fp);
    	}
    
        return 0;
    }
    
    int main(int argc, const char * argv [])
    {
    	my_fwrite();
        
    	my_fread();
    
        return 0;
    }
    

     

     

    展开全文
  • 若带 [count],选择的字符或行数和上次的可视操作使用的一样,但乘以 [count],且从当前光标位置开始。 如果上次可视模式是基于块的,块宽度与高度同时乘以 [count]。如果没有上次可视操作,选择 [count] 个字符...
  • 数学符号:+-×÷﹢﹣±/= ∥∠ ≌ ∽ ≦ ≧ ≒﹤﹥ ≈ ≡ ≠ = ≤ ≥ < > ...物理单位:㎎ ㎏ ㎜ ㎝ ㎞㎡㏄ ㏎ ㏑ ㏒ ㏕ ℡ % ‰ ℃ ℉ °′″$ £ ¥ ¢ ℅ 数字序号:① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ㈠ ...
  • 内存操作的其他函数:内存初始化,内存拷贝,内存比较 1、内存初始化 语法:void*memset(void *s , int c , size_t n) 说明:从给定的地址s开始,将n个字节中的值设置为c。 作用:该函数以字节为单位进行操作,...
  • 今天真的是惊出了一身冷汗,平时编程...结果在拷贝其中一个东西出来时突然停住,资源管理器没有任何反应,重启机器发现读盘特别慢,那个我存有大量心血的分区字节为0,而且格式为RAW了。 虽然最终仅仅通过chkdsk X:
  • 结果在拷贝其中一个东西出来时突然停住,资源管理器没有任何反应,重启机器发现读盘特别慢,那个我存有大量心血的分区字节为0,而且格式为RAW了。 虽然最终仅仅通过chkdsk X: /F这种简单的办法恢...
  • 直接拷贝任意类中通过类型调用即可 ... // 如果字节少于1024,则直接以B为单位,否则先除于1024,后3位因太少无意义 if (size < 1024) { return String.valueOf(size) + "B"; } else { size = size
  • 第一代数字杂志最著名的技术服务商当至今还在运营的“邮件列表专家”——希网网络,“邮件列表”几乎成了第一代数字杂志的代名词。 第一代数字杂志因其实质就是一般的html网页,因此具有阅读上的便捷性,但人们...
  • 拷贝一份附上您的个人信息发送到上面的作者邮箱,作者负责在全面测试后发布您修改后的新版本。 3.您使用本程序而导致任何伤害以及经济损失,由过错方依法承担所有责任,一概与第一作者及合作单位无关。 ...
  • 在 进行计算机审计的过程中对于从被审计单位全库拷贝或导出的数据我们可以通过DTS工具导入SQL SERVER 2000中进行分析,但是面对几百张甚至上千张数据表如何知道哪些表有用哪些表无用呢?其中要做的一个例行的检查...
  • 为什么有了strcpy还要有memcpy 因为strcpy是用来拷贝字符和字符串的,strcpy是按字节拷贝的,一个字节一个...count为要拷贝的字节单位是字节 使用memcpy #include<stdio.h> #include<string.h> int m
  • 目录 -字符分类函数 isdigit 检查字符是否为十进制数字 ...memset- -以字节为单位来设置内存 isdigit 字符转换函数- -tolower 内存转换函数 1、memcpy- -拷贝的类型可以任意 void * memcpy ( void * destinatio
  • 快速查找 输入 显示 主程序 查找 插入 删除 保存 读入 按序号查找 拷贝 排序 数据结构 由于使用静态数组需要预先估计记录所以先预定义一个常熟M表示记录也就是数组的大小记录联系人的信息至少应有姓名单位
  • ——如果你需要粘贴的是整行为单位,那么p命令将在光标的下一行开始粘贴; ——如果你拷贝的是非整行的局部字符串,那么p命令将在光标后开始粘贴。 2、拷贝命令 vim用 y 命令来实现拷贝: y [数字] motion 其中...
  • plink的主要功能:数据处理,质量控制的基本统计,群体分层分析,单位点的基本关联分析,家系数据的传递不平衡检验,多点连锁分析,单倍体关联分析,拷贝数变异分析,Meta分析等等。 首先必须了解plink的三种格式...
  • plink的主要功能:数据处理,质量控制的基本统计,群体分层分析,单位点的基本关联分析,家系数据的传递不平衡检验,多点连锁分析,单倍体关联分析,拷贝数变异分析,Meta分析等等。   首先必须了解plink的三种...
  • TCP协议(二)

    2018-09-13 17:58:42
    以字节为单位的滑动窗口 正常情况: 首先要设定接收窗口的字节,发送窗口字节由对方接收窗口的字节决定。 首先将要发送的文件,依次拷贝到发送缓存中。 依次将窗口内的数据发出,无需等待对方回复,...
  • 永中Office提供了电子签章功能,通过电子签章,单位或个人可以实现数字盖章,且利用数字签名杜绝他人伪造或盗用您的公章;您也可以对公文进行加密,让拥有密码并通过签章验证的用户查阅公文;您还可以通过对公文的...
  • 程序中需要输入三个数据,分别是温度t(单位℃),床料真密度rp(单位Kg/m3)以及床料平均立即dp(单位m),按照程序提示输入即可自动计算得到临界流化速度和对应的雷诺。程序中计算临界流化速度采用的是简化公式。
  • 实验二 SQL语言

    2020-08-18 16:03:13
    实验二 SQL语言 实验目的 熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录。 创建索引,删除索引。 创建视图,使用视图,删除视图。 实验内容 现有一个单位内部的小型...3、 拷贝代码运行,删去旧的同名
  • js基础笔记

    2021-01-12 22:28:08
    1、执行语句:单位:表达式 (表达式是由变量,常量,运算符构成 变量:表达式,var 特点,没有类型 常量:数据:String(值类型), Number(值类型), Boolean(值类型), undefined(值类型), null(值类型), ...
  • C++的继承关系

    2019-06-09 19:46:16
    创建名为Vehicle(车)的基类,它含有制造商的名称(string类型)、发动机缸(int 类型)以及车主(Person类型)然后创建Vehicle类的一个派生类Truck(卡车),它具有一些附加属性,包括载重(double类型 单位:吨)...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 155
精华内容 62
关键字:

拷贝数单位