精华内容
下载资源
问答
  • 起因】希望对各种类型的数组进行初始化,避免野值memset函数将s所指向的某一块内存中的每个字节...【函数头文件】提示:在linux中可以在terminal中输入 "man memset"进行查询 #includevoid *memset(void *s, int c,...

    起因】希望对各种类型的数组进行初始化,避免野值

    memset函数将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。

    【函数头文件】

    0818b9ca8b590ca3270a3433284dd417.png提示:在linux中可以在terminal中输入 "man memset"进行查询

    #include

    void *memset(void *s, int c, size_t n);

    【使用说明】 The  memset()  function  fills  the  first  n  bytes of the memory area  pointed to by s with the constant byte c.

    【错误用法】

    int array[10];

    memset(array,1,10);//或者memset(array,1,sizeof(array)),都是不对的!

    【解释】

    之前一直不明白为什么memset这个函数的头文件是 "string.h",看完下面的内容,你就会明白了。

    memset函数使用说明中提到的是按照byte来填充。

    举例来说

    char arr[10]; memset(arr,'a',10);

    由于char只占一个字节(byte),因此函数的结果是将连续的10个字节都填充为'a'。这是我们所期待的结果!

    int arr[10];memset(arr,1,10);

    由于int占4个字节(byte),因此"1"对应的二进制(32bits下)为"00000000000000000000000000000001"(4bytes),塞到1byte(8bit)的中,高位被舍弃了。所以,填入数组中的值是"00000001"。然而总共有10*4=40个byte,却只有10个byte被填充,因此结果是"00000001……00000001**********"(前面总共10个"00000001")。因此,第一个数是"0x01010101"=16843009(10进制),数组其余部分的值则是随机值,读取出来会是很离谱的数!

    有人说,可以这样memset(arr,1,sizeof(arr));

    其实这样做,就是将数组的所有值都填充为"0x01010101",也就是int数组的初始值变为了16843009!这确实有点出乎我们的预料!

    【正确用法】

    方法一:可以用任何值来初始化char数组!比如 memset(arr,'a',10);

    方法二:可以用"0"来初始化任何类型数组!比如 memset(arr,0,sizeof(arr));//arr可以是char或int等类型数组!

    【小结】版权所有,如有转载请注明出处:blog.csdn.net/whuslei

    不难看出为什么memset在"string.h"头文件中声明了,因为他是以byte为单位来处理的,而char正好是一个byte!

    用"0"来初始化数组时,要初始化的长度最好用sizeof(arr)来计算,这样避免出错!是不是很强大?

    当然,并非任何时候都需要初始化!详情请参考http://www.cublog.cn/u1/49221/showart_422256.html

    程序例

    #include

    #include

    #include

    int main(void)

    {

    char buffer[] = "Hello world/n";

    printf("Buffer before memset: %s/n", buffer);

    memset(buffer, '*', strlen(buffer) );

    printf("Buffer after memset: %s/n", buffer);

    return 0;

    }

    输出结果:

    Buffer before memset: Hello world

    Buffer after memset: ***********

    编译平台:   Microsoft Visual C++ 6.0

    也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。

    例如下面这样:

    int array[5] = {1,4,3,5,2};

    for(int i = 0; i < 5; i++)

    cout<

    cout<

    memset(array,0,5*sizeof(int));

    for(int k = 0; k < 5; k++)

    cout<

    cout<

    输出的结果就是:

    1 4 3 5 2

    0 0 0 0 0

    后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。

    要注意的是,memset是对字节进行操作 , 所以上述程序如果改为 :

    int array[5] = {1,4,3,5,2};

    for(int i = 0; i < 5; i++)

    cout<

    cout<

    memset(array,1,5*sizeof(int));

    // 注意 这里与上面的程序不同

    for(int k = 0; k < 5; k++)

    cout<

    cout<

    输出的结果就是:

    1 4 3 5 2

    16843009 16843009 16843009 16843009 16843009

    为什么呢 因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用 ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是 00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

    展开全文
  • memset函数简析功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void *memset(void *s, char ch, unsigned n...

    memset函数简析

    功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,
    块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作
    
    用 法: void *memset(void *s, char ch, unsigned n);
    
    对比:
    memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
    
    strcpy就只能拷贝字符串了,它遇到'/0'就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘/0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。

    memset:char型初始化函数

    头文件: 或

    函数原型:void memset(void s , int ch , size_t n )

    memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );
    
    memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );
    
    函数解释:将s中的前n个字节用ch替换并且返回s
    
    函数作用:在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。
    //例1
    #include<iostream>
    //#include"string.h"
    using namespace std;
    int main()
    {
        char str[10];
        str[9] = 'w';
        memset(str,97,9);
        for(int i=0;i<10;i++){
            cout<<str[i]<<" ";
        }
        return 0;
    }

    输出:a a a a a a a a a w

    说明:使用memset似乎不需要使用额外的头文件。

    //例2
    

    输出:a a a a a a a a a a

    #include

    *输出:A A A A A A A *


    若你对人工智能(CV/NLP)、C++/python编程、互联网就业及发展有兴趣,欢迎点赞关注和收藏。谢谢鼓励!!!

    C++相关知识:

    Anxjing.AI:C++ this_thread::sleep_forzhuanlan.zhihu.com
    dde3f8a9b6784a900e8482dd7e1590f7.png
    Anxjing.AI:C++ Lambda表达式zhuanlan.zhihu.com
    3a06077ab88871b29257453f6b1c405c.png
    Anxjing.AI:C++并发_condition_variablezhuanlan.zhihu.com
    cec9de46a2bb04478584ee074950184a.png
    Anxjing.AI:生产者-消费者模型zhuanlan.zhihu.com
    c9218cf2cdb62ed0cae4cf3395097087.png
    Anxjing.AI:C++预处理指令zhuanlan.zhihu.com
    94f7689cd986b92396354bf0b65a71ff.png
    Anxjing.AI:C++工具:Cmakezhuanlan.zhihu.com
    5bbb995914089662243e7e063ab05692.png
    Anxjing.AI:SSH 学习zhuanlan.zhihu.com
    7dbfcd612494948520a2e18d85670a9d.png
    Anxjing.AI:记录C++阶段性学习一zhuanlan.zhihu.com
    a7dc2767a8edd329044da340d60bd794.png
    Anxjing.AI:DesignPatterns C++:单例模式zhuanlan.zhihu.com
    39eb25012d2a61667a9313e73e454e40.png
    Anxjing.AI:C++基础:map简析zhuanlan.zhihu.com
    b3e0ea60e07df5d42e2f2ba6830af96e.png
    Anxjing.AI:C++基础:memset函数简析zhuanlan.zhihu.com
    a34dca6ac126ededda298c66608f2ef7.png
    Anxjing.AI:C++基础:break&continue区别zhuanlan.zhihu.com
    07e54f8f22abef2b902ff065c69fe694.png
    Anxjing.AI:C++基础:指针和引用的区别zhuanlan.zhihu.com
    c46cc4afdb36f8b5940d25383fccc415.png
    Anxjing.AI:C++中::和:, .和->的作用和区别?zhuanlan.zhihu.com
    fa592f4ef45ccbf78933146887f9dec1.png
    Anxjing.AI:string中c_str()的使用方法和特性zhuanlan.zhihu.com
    b3e0ea60e07df5d42e2f2ba6830af96e.png
    Anxjing.AI:C ++ strcpy()和strncpy()函数zhuanlan.zhihu.com
    e13cb348b01688a7f76c82b869de4fa5.png
    Anxjing.AI:C++基础-关键字virtualzhuanlan.zhihu.com
    2f5a55bc0da6999d217a023e698552df.png
    Anxjing.AI:C++基础-函数重载zhuanlan.zhihu.com
    616b0a5fadd02418fd229645305e734a.png
    Anxjing.AI:C++基础-staticzhuanlan.zhihu.com
    43e8bae70c7cf8b172da0d0af31a81d2.png
    Anxjing.AI:C++基础:判断文件是否存在的方法zhuanlan.zhihu.com
    8ec04641dad8d5bd877d7663b98a6fe3.png
    Anxjing.AI:C++基础-strstr查找子串zhuanlan.zhihu.com
    e87bd8d07a5801cf155a0810c0409f7b.png
    Anxjing.AI:C++基础:std::thread多线程zhuanlan.zhihu.com
    a4d22637fb7fdd94118622bac117f179.png
    展开全文
  • //语言:C//一起刷,讨论的dalaoes私信加好友!评论!//ide:vs2017,VS牛逼!//所有代码都是能在VS下正常通过编译而非正常提交到PAT,正常提交仅略微修改适应提交(具体就是一些_s,C和C++的部分差异问题,详见专栏中...

    572fc2f64649f2eba8a9f97fa3593897.png

    //题目链接https://www.patest.cn/contests/pat-b-practise

    //语言:C

    //一起刷,讨论的dalaoes私信加好友!评论!

    //ide:vs2017,VS牛逼

    //所有代码都是能在VS下正常通过编译而非正常提交到PAT,正常提交仅略微修改适应提交(具体就是一些_s,C和C++的部分差异问题,详见专栏中某些前文pat刷题记)

    //代码运行时间来源于提交(经多次提交确认取非香港主机的结果)

    //持续更新中~

    //通过率参考:

    64361865fbcdddf25dd088031c750212.png
    1045是真的还好。1048是真的有毒。--你看今天专栏换的头像就知道了、

    #include <stdio.h>

    int main()

    {

    1045:

    写完后我又想了想这题为什么0.18,挖了一个小坑(还拉你一把)肯定不是主要原因(后面再写),可能是正好打中了我们的惯性思维;

    这题摆明了就是比一下前面数的最大值,后面数的最小值。两个条件都ok就存到一个新的数组里,然后再排序。然而10W数据量200ms,怎么操作才能得到前面的最大值和后面的最小值?硬来是断然不行的,每次都要遍历所有的n^2+,断然超时。进行排序也不行,整个数组分成了两节还要除去一个元素,势必要涉及数组元素的删除重组--这不是C干的事儿。想过计算,感觉也并没有什么头绪。剩下就剩一个双向递归--我觉得这不是人干的事儿,而且还很有可能也超时。似乎走进了死胡同?;

    后来冷静下来就发现自己掉进了自己的惯性思维:沉迷于一步到位的优化。什么意思呢?假设要录入两个等长的数组,我恨不得就遍历一圈,一次录两个--这样只录一圈就录好了。这确实在复杂度上有了优化,但我要付出非逻辑顺序的代价(不是一次打完数组a再数组b,而是一个a[i]一个b[i}往里输);插排和冒泡对每个数都一次到位了,也不需要太多额外空间,但相比不是一次到位的快排而言就慢多了。算法从来没有完爆,只有平衡和选择;

    简而言之,这题的思路就类似于把冒泡改快排--可以不要一次到位,可以给你点空间,但你得整快点:

    将原来数组定义成结构体,每个搭个bool型的小尾巴(写C++的数据库老师新讲的,感觉很适合这里和cmp就用了,省空间)。首先从头到尾遍历一圈,将左边的最大值大于这个数的bool值改成false,再从尾到头遍历一圈,将右边最小值小于这个数的改成false。于是这个题目就改成了德才论([新手][PAT乙级][C]刷题记1013-1016--1015:qsort多条件排序);

    于是(?)考虑优化,第一遍遍历可以直接跟着录入,时间又短了,哇咔咔;

    我是事先注意看了这个0.18的,一全想通感觉整个人都飘了。好久没写过cmp(一直对这个似懂非懂每次对着写的),这次写一个陌生样式的,就跟着感觉走居然直接写对了,感觉自己好像灵魂出窍换了个人一样;

    在后面具体过程就不写了,脑子里就一把过三个字了。最后调试了下没有点的:2n2 1结果输出0n1,(Ak什么都算到了.jpg)于是加了个等于0就直接跳过输出模块return 0;(n是回车换行的意思别想多了)

    提交气死咱了,掉了个活久见的错误:

    f9b50a74f177632d53eec45bedbd477d.png

    仔细看了一圈代码,感觉完全没有格式错误的点,重新看题,他没有怎么说为0如何,就说第一行第二行,感觉应该是这个0也要来第二行直接n吧,遂加一个printf("n");,AC;

    C++AC,交C报unknown type name 'bool',遂百度之,error: unknown type name ‘bool’,加一行#include <stdbool.h>,AC;

    代码(C 32ms 1900kb, C++ 32ms 1896kb 测试点2:没有主元符合条件)

    #include 

    1046:

    感觉没什么好说的,简单说下优化(其实并不需要,400ms)的思路:

    1.不要存数据,判断一次类似哈希加一下就好;

    2.判断胜负:先判断两个是否相等,再判断相加的和等于A或者B,相对于最后判断相等再另外操作复杂度低;

    代码(C 3ms 384kb,C++ 3ms 480kb)

    #include 

    1047:

    1047理论上说这题可以不走哈希(最多1W,1k组,如果数据量小而散哈希最后取1000个里的最大值相当亏),不过写起来简单无脑啊!反正400ms无人权,超不了;

    中间第二个值其实是无效的干扰条件,直接%*d喂苟;

    代码(C 4ms 384kb,C++ 4ms 480kb)

    #include 

    1048:

    这题毒性堪比福尔摩斯,我这么说应该没有人不服吧。(严肃到没有分号)

    扒一扒这题的坑(同志们,看到了作者,一定要警惕啊!!):

    1.专打VS党,疯狂报段错误(我被坑了两次)

    5aa7de6e426b55c391333ead93363cf3.png

    这个点就在于你录入字符串时候本来录入的句子scanf_s("%s %s", code, 101, str, 101);交上去你如果只去了_s(还要去掉限定的长度)一般会报编错:函数参数多了,但这里他报段错误。我看的满脸问号,折腾了以下。到最后我也不知道为什么会报段错误。--我想这可能是他们挖坑的时候踩出来的一个坑吧?;

    2.

    对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12

    听说你扑克玩的很6

    3.

    奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。

    什么是奇数位?难道不是这个数是奇数,就是奇数位吗?后面还有一句看似莫名其妙,其实含蓄的话

    这里令个位为第1位。

    //这里还好的一点是,如果你仅仅没看到这里测试例子会发现问题。如果万一像我一样同时写错了去判断A的数字的奇偶的话,因为A是1234567,你就会这样,几乎万劫不复:

    77125784cf596f6fe4473821bae6d255.png

    如果说上面123都是我自己的问题的话,那么还有;

    4.

    看例子你明白了如果B比A长,长的部分不用处理。那么如果A比B长,就安心处理B的呢几位就好?;

    这个题最坑的就是你以为如果A的位数比B长就不用管了,其实还是得把B补成跟A一样长才行。--PAT乙级-1048. 数字加密(20)-native

    5.

    什么,也就这样了?现在我们考虑以下情况:

    输入01 01会发生什么?;

    输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。

    诶,我一直都说这是正整数啊喂!你要咋整是你的事儿,但我就100位了,有本事你咬我?你说他是字符串就字符串?你哪里看到我提他是字符串了?; (@陈越姥姥 如果这里没设点的话设一个呗,指不定能超越福尔摩斯啊!(奸笑.jpg))

    我是真的佩服这0.24,他们到底经历了怎样的折磨才能AC;

    我大概的经历:看出12,被3坑了->看出3,被4坑了->一晚上没睡好,想出可能是5的问题,重写,继续被4坑(关于5有没有设点,其实我是不知道的,因为我改了之后提交跟之前结果完全一样,但不排除这里设点的可能)->百度得到4,稍微修改AC;

    代码(16/20, 掉测试点2 5,包括之前没有注意5的尸体,AC代码思路也基于此)

    #include 

    AC代码(基于上面胡乱改的,可能不太合乎优化,难受不想想了)(C 3ms 384kb,C++ 3ms 480kb)

    #include 

    //回头看配图,感觉好亲切;

    return 0;

    }

    1>------ 已启动生成: 项目: , 配置: Debug Win32 ------

    1>.cpp

    1>已完成生成项目“.vcxproj”的操作。

    ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 个 ==========

    展开全文
  • 关于c语言memset头文件及模板

    万次阅读 2019-07-06 15:35:26
    头文件:#include<string.h> 模板:比如你定义了一个一维数组 int a[1000];你可以这样初始化全为0 memset(a,0,sizeof(a));//括号中分别是(数组名,要初始化的数,数组的长度可以用sizeof来求) 但是要注意,...

    头文件:#include<string.h>
    模板:比如你定义了一个一维数组
    int a[1000];你可以这样初始化全为0
    memset(a,0,sizeof(a));//括号中分别是(数组名,要初始化的数,数组的长度可以用sizeof来求)
    但是要注意,初始化不可以初始任何值,是因为memset初始化方式是是按字节
    如果memset想把一个数组初始化为很大,可以
    memset(a,0x3f,sizeof(a));或者memset(a,0x3f3f3f3f,sizeof(a));其结果都是初始化为
    0x3f3f3f3f,即为1061109567,这个数有很多好处,大家可以搜一些别的博客,尤其在图论中边的松弛中有大的用处
    在这里插入图片描述

    展开全文
  • memset

    2021-03-29 17:05:44
    memset头文件 #include<cstring> 一般用于清零 int a[10]; memset(a,0,sizeof(a));
  • memset用法

    2019-08-14 08:56:57
    之前对0x十六进制理解错误,做一下笔记。...memset头文件是#include<cstring> memset用于初始化,memset(a,val,sizeof(a)), val取值范围(0x00~0xff),作用是将val填充到每个字节上,所以memset只能初始化...
  • malloc 头文件: stdlib.h 或者 malloc.h memset 头文件: string.h 或memory.h  printf 头文件: stdio.h
  • [Warning] incompatible implicit declaration of built-in function ‘memset’ ...好吧,原来是缺了memset头文件**#include <string.h>** 这个缺少头文件不会报错,但是有warning 原则上编译的
  • memset()函数包含的头文件

    千次阅读 2011-09-08 19:38:24
    memset()函数在c++中包含在头文件中。
  • memset(a, -0x7f, sizeof a); 很好记不是吗2333 测试结果: int: -2122219135 0x81818181 ll : -9114861777597660799 0x8181818181818181 同样,相加会爆类型 安全赋值法:-0x3f or -63 使用 memset(a, -...
  • memset函数简析功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void *memset(void *s, char ch, unsigned n...
  • 头文件

    2019-03-01 11:29:04
    #include<...#define mem(a,b) memset((a),b,sizeof(a)) #define de cout<<endl<<endl<<endl typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=1e5+10; us...
  • 深入学习C语言中memset()函数的用法头文件:#include memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:void * memset( void * ptr, int value, size_t num );参数说明:ptr 为要操作的内存的指针...
  • c/c++内存库函数

    2017-04-09 10:36:21
    内存操作库函数memset 头文件cstring中声明: void * memset(void * dest,int ch,int n); 将从dest开始的n个字节,都设置成ch。返回值是dest。ch只有最低的字节起 作用。 内存操作库函数memset 头文件cstring中...
  • memset函数

    2014-08-25 06:27:22
    memset 函数 头文件: string.h 函数sheng ming
  • PAT甲级刷题笔记

    2019-08-26 17:34:33
    PAT甲级刷题笔记一些自带函数的用法memset 一些自带函数的用法 memset 头文件:cstring int a[10]; memset(a,1,sizeof(a)); //将数组a内的元素初值设置为1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 963
精华内容 385
关键字:

memset头文件