游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

10个C库函数的那些坑

  函数是C语言的基石,函数库是面向过程编程语言的重要组成部分。
  通常,使用库函数只需要理解其接口即可,接口和注释通常会较友好地透露如何使用的细节,而一些库函数手册还会增加一些有代表性的实例,以加强用户对其理解。但一些库函数在使用时出错频率较高,原因是实现时在安全、易使用性、效率等方面需要有所取舍,要避坑及深入理解其原因,自然需要深入理解库函数背后实现的细节。
  1intscanf(charformat,ptrParaList)(stdio。h)
  Readfromstandardinputundercontroloftheformatstring;equivalenttofscanf(stdin,charformat,args)
  全部参数为指针(第一个参数是字符指针);
  读取整型或浮点型数据时会忽略掉前面的空白字符(以空白字符(isspace())为分隔);
  2intfscanf(FILEf,charformat,ptrParaList)(stdio。h)
  Readfromthefileundercontroloftheformatstring。
  当试图读取文件中的一行以空白字符分隔的字符串时,字符串并不以空白字符做分隔,而是将空白字符做为普通字符一起读取。如果以空白字符分隔分隔的字符串长度固定,可以指定固定长度读取,否则需要先fgets(),然后使用strtok()来处理。sscanf()也是如此。例如要读取下面的文本:PKL071ParkLens86。50BLJ372BallJoint1211。95PKL073ParkLens86。50FLT014OilFilter237。95DKP085DiscPads169。99GSF556GasFilter94。50FLT017OilFilter237。95
  以下代码直接报错:typedefstructpartRecord{charpartNum〔PartNumSize1〕;charname〔MaxName1〕;intamtInStock;doubleunitPrice;}PartRecord;FILEftxt,fbin;PartRecordpart;if((ftxtfopen(parts。txt,r))NULL){printf(Cannotopenpartsfile);return1;}while(fscanf(ftxt,ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice)4){printf(ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice);if(fwrite(part,sizeof(PartRecord),1,fbin)!1){printf(Errorinwritingfile);return1;}}
  以下代码没有正确读取:constintMAXCHAR128;charstr〔MAXCHAR〕{0};for(inti0;i7;i){fgets(str,MAXCHAR,ftxt);sscanf(str,ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice);printf(ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice);if(fwrite(part,sizeof(PartRecord),1,fbin)!1){printf(Errorinwritingfile);return1;}}
  以下代码OK:constintMAXCHAR128;charstr〔MAXCHAR〕{0};for(inti0;i7;i){fgets(str,MAXCHAR,ftxt);sscanf(str,ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice);strcpy(part。partNum,strtok(str,));strcpy(part。name,strtok(NULL,));part。amtInStockatoi(strtok(NULL,));part。unitPriceatof(strtok(NULL,));printf(ssdf,part。partNum,part。name,part。amtInStock,part。unitPrice);if(fwrite(part,sizeof(PartRecord),1,fbin)!1){printf(Errorinwritingfile);return1;}}
  3charfgets(chars,intn,FILEf)(stdio。h)
  Readatmostn1charactersintothesarray;stopsatanewline,whichisincludedinthearray。Thearrayisautomaticallyterminatedwitha。charbuf〔6〕;fgets(buf,6,stdin);input:abcdeffputs(buf,stdout);output:abcde
  4charstrcpy(chard,chars)(string。h)
  Copystringstostringd
  strcpy并没有边界检查,d所指缓冲区所有足够空间,否则会溢出。
  5charstrcmp(chard,chars)(string。h)
  Comparestringdtostrings;return0ifds
  注意两字符串比较相等的结果是0而不是其它值。
  6charstrlen(chard)(string。h)
  Returnthelengthofstringd,notincludingtheterminatingNULL。
  strlen函数的实现以‘为结束标志printf(d,strlen(s16end));3
  7voidmemcpy(voidd,voids,intn)(string。h)
  Copyncharactersfromstod。
  memcpy并没有检查d和s所指区域在复制时是否存在重叠情况,如果存在重叠,会出错。
  memmove()有考虑重叠的情况。
  8voidmemset(voidd,intc,sizetn);(string。h)
  Filldwithnoccurrenceofc。
  注意其其参数类型,以下操作通常没有问题:
  以单字节数据(字符或零值)填充字符串;
  以布尔值填充布尔数组;
  以零值填充数组;
  以下操作通常不是预想的结果:
  以非单字节数据填充数组;
  以单字节数组(非零值)填充非字节数据的数组;
  以整型数据1填充整形数组;
  原因是memset的实现是以字节为单元去填充内存空间的:charmemset(dst,val,count)setscountbytesatdsttovalPurpose:Setsthefirstcountbytesofthememorystartingatdsttothecharactervalueval。Entry:voiddstpointertomemorytofillwithvalintvalvaluetoputindstbytessizetcountnumberofbytesofdsttofillExit:returnsdst,withfilledbytesvoidcdeclmemset(voiddst,intval,sizetcount){voidstartdst;while(count){(char)dst(char)val;dst(char)dst1;}return(start);}
  9charstrtok(charstring,constcharcontrol)(string。h)
  细节:
  分割字符串时,需要多次调用以依次返回被分割后的子串,子串结尾会附以;
  非第一次调用strtok()时,其首参以NULL开始,其内部实现以一个静态变量记录了下次开始分割的目标字符串的位置;strtok。ctokenizeastringwithgivendelimitersPurpose:definesstrtok()breaksstringintoseriesoftokenviarepeatedcalls。charstrtok(string,control)tokenizestringwithdelimiterincontrolPurpose:strtokconsidersthestringtoconsistofasequenceofzeroormoretexttokensseparatedbyspansofoneormorecontrolchars。thefirstcall,withstringspecified,returnsapointertothefirstcharofthefirsttoken,andwillwriteanullcharintostringimmediatelyfollowingthereturnedtoken。subsequentcallswithzeroforthefirstargument(string)willworkthruthestringuntilnotokensremain。thecontrolstringmaybedifferentfromcalltocall。whennotokensremaininstringaNULLpointerisreturned。rememberthecontrolcharswithabitmap,onebitperasciichar。thenullcharisalwaysacontrolchar。Entry:charstringstringtotokenize,orNULLtogetnexttokencharcontrolstringofcharacterstouseasdelimitersExit:returnspointertofirsttokeninstring,orifstringwasNULL,tonexttokenreturnsNULLwhennomoretokensremain。charstrtok(charstring,constcharcontrol){unsignedcharstr;constunsignedcharctrlcontrol;unsignedcharmap〔32〕;intcount;staticcharnextoken;for(count0;count32;count)map〔count〕0;Setbitsindelimitertabledo{map〔ctrl3〕(1(ctrl7));}while(ctrl);Initializestr。IfstringisNULL,setstrtothesavedpointer(i。e。,continuebreakingtokensoutofthestringfromthelaststrtokcall)if(string)strstring;elsestrnextoken;Findbeginningoftoken(skipoverleadingdelimiters)。Notethatthereisnotokeniffthisloopsetsstrtopointtotheterminalnull(str)while((map〔str3〕(1(str7)))str)str;stringstr;Findtheendofthetoken。Ifitisnottheendofthestring,putanullthere。for(;str;str)if(map〔str3〕(1(str7))){str;break;}Updatenextoken(orthecorrespondingfieldintheperthreaddatastructurenextokenstr;Determineifatokenhasbeenfound。if(stringstr)returnNULL;elsereturnstring;}
  10isblank()andisspace()(ctype。h)
  intisblank(intc);
  Checkifcharacterisblank
  Checkswhethercisablankcharacter。
  Ablankcharacterisaspacecharacterusedtoseparatewordswithinalineoftext。
  ThestandardClocaleconsidersblankcharactersthetabcharacter()andthespacecharacter()。
  Otherlocalesmayconsiderblankadifferentselectionofcharacters,buttheymustallalsobespacecharactersbyisspace。
  intisspace(intc);
  Checkifcharacterisawhitespace。
  Checkswhethercisawhitespacecharacter。
  FortheClocale,whitespacecharactersareanyof:
  (0x20)
  space(SPC)
  (0x09)
  horizontaltab(TAB)
  (0x0a)
  newline(LF)
  v
  (0x0b)
  verticaltab(VT)
  f
  (0x0c)
  feed(FF)
  r
  (0x0d)
  carriagereturn(CR)
  Otherlocalesmayconsideradifferentselectionofcharactersaswhitespaces,butneveracharacterthatreturnstrueforisalnum。
  11其它
  11。1setbuf()用来设置缓冲区特性,如果需要改变缓冲的特点和大小等,使用该调用。
  11。2fflush(stdin)、fflush(stdout)用来强制刷新缓冲区数据。如果需要在每次io操作前后,不希望缓冲中存在历史数据或者不期望的数据或者为了清除缓存等的时候使用。
  11。3setbuf(stdin,NULL);
  把输入缓冲区设置为无缓冲,直接从流读取数据。
  11。4EOF的值是由fgetc()、fgets()动态设置,需要由此类函数调用后返回后的字符与EOF比较判断。
  End

红海行动曝新海报林超贤超越湄公河极限之作近日,被林超贤导演说成自己从影以来拍摄上最为艰难的一部电影《红海行动》,发布了一组超越极限版海报,而海报的主角正是林超贤本人。海报中林导表情严肃,一身戎装手持枪械仿佛化身蛟龙突……冯小刚芳华破12亿邝晓彤用舞技打动观众由冯小刚执导的电影《芳华》正在全国各大院线热映中,自上映以来,票房一路飙升,目前该电影票房已破12亿。《芳华》改编自严歌苓同名小说,讲述了一群正值青春芳华、满怀理想的文工团成员……西游记女儿国曝开运五福海报邀观众同飞香港送新春奢华礼包由郑保瑞执导,郭富城、冯绍峰、赵丽颖、小沈阳、罗仲谦、林志玲、梁咏琪、刘涛、苑琼丹、潘斌龙、施诗等主演的魔幻爱情喜剧《西游记女儿国》将于2018年大年初一登陆全国院线。值此开年……反派大boss荒岛求生伺机复仇丛林大乱斗脑洞大开由法国图卢兹TAT动画公司出品,法国著名导演DavidAlaux执导的长篇动画萌作《丛林大乱斗》近日公布了一款中文概念海报和先导预告,海报以一座小岛为背景,配以企鹅形状云朵,画……红海行动曝霸气单人海报蛟龙小队各显神通跨境救援近日,由林超贤导演的军事动作电影《红海行动》曝光一组角色海报,饰演队长杨锐的张译、饰演副队长兼爆破手徐宏的杜江、饰演狙击手顾顺的黄景瑜、饰演机枪手佟莉的蒋璐霞、饰演观察员李懂的……薛飞活纸人演技拉风斩获澳门电影节最佳男主角近日,第9届澳门国际电影节正式开幕,实力派演员薛飞凭借网络电影《活纸人》获第9届澳门国际电影节最佳男演员奖,成为澳门电影节历史上的第一位网络电影影帝,与时俱进的影帝身份引起了业……继承者计划定档1月18日首曝先导预告点燃肾上腺素流量小生演技扛把子王彦霖最近又添新作,由他主演的新剧《继承者计划》今日曝出先导预告和先导海报,定档2018年1月18日,于搜狐视频独家上线。该片讲述的是常年游荡在东北大街上的小……西游记女儿国漫漫取经路四师徒勇闯情关福笑齐飞由郑保瑞执导,郭富城、冯绍峰、赵丽颖、小沈阳、罗仲谦、林志玲、梁咏琪、刘涛、苑琼丹、潘斌龙、施诗等主演的魔幻爱情喜剧《西游记女儿国》将于2018年大年初一登陆全国院线。日前片方……卧底巨星曝人物海报陈奕迅李荣浩打造最强喜剧CP定档2018年1月12日全国公映的喜剧动作电影《卧底巨星》,今日曝光了一组人物海报,功夫巨星陈奕迅、业余卧底李荣浩、和花瓶女主李一桐三位主演站立在不同的标靶前,彩色的背景和主演……张惠妹为什么爆肥张惠妹离奇长胖背后的秘密经常关注娱乐圈的网友发现,天后张惠妹冷不丁就突然爆肥了,没有任何过渡阶段,忽然就爆肥,这到底是什么原因呢?张惠妹忽然爆肥的新闻上了热搜,为何张惠妹长胖了就能上热搜。曾经拥有魔鬼……我的青春都是你青春告白版特辑海报双发似水流年毕业不伤感星关系6月5日讯由柴智屏监制、新锐导演周彤、代梦颖执导,少女代言人宋芸桦和新一代国民校草宋威龙联袂出演的2019青春爱情走心之作《我的青春都是你》将于6月21日全国上映。影片今……PS4Pro和NS只能选一个,选哪个好呢?为什么?讲个故事:去年马里奥奥德赛刚发布,我买的NS,非常好玩,客厅玩,卧室玩,上班路上玩。通关收集要素后,NS吃灰了两三个月后,我因为怪物猎人世界买了ps4,ns仍……
模玩资讯SUPER7ULTIMATES!2001太空漫游角色美系玩具厂牌SUPER7旗下可动人偶系列ULTIMATES!Figures,以最有影响力科幻电影作品之一的《2001太空漫游》主题,推出全新的四弹作品!分别是戴维鲍曼博士、法兰……性价比最好的几款千元机用三年都不卡顿前段时间,许多手机厂商推出了最强的千元机器,荣耀9X就是其中之一。虽说它是一个很好的选择,但它也不是唯一的选择。例如,魅族16th、荣耀20s、红米K20Pro都是性价比极高的……人力资源技术公司Justworks视觉形象升级Justworks成立于2012年,是美国纽约一家人力资源技术公司,其提供的平台可帮助雇主管理薪资,福利,员工信息以及与雇佣相关的合规性,以使企业更容易启动、运行和发展,并为中……瀚海法拍网季报金九强势收官,第三季度成交781套,环比涨22来源:房天下导读:2021年3季度,多重调控政策持续发酵叠加信贷监管收紧,楼市整体增长动能乏力,成交规模呈下降态势,金九成色不足。北京出现连续5个季度的首次下行,截止9月……旗舰芯片全新系统,能独立上网打车的小米手表发布,售价1299中奇万铎发自小米科技园鹅板凳公众号ebandeng在今天小米新品发布会上,除了小米电视5和小米CC9Pro,还有小米预热已久的小米手表。外观方面,采用1。78……反悔了?魅族删除三零手机相关消息,手机终究摆脱不了广告在9月9日上午,魅族Flyme官方微博发布《致魅族用户的一封信》,其中提到说,魅族在面对激烈的竞争,反复斟酌后决定做出以下调整:Flyme在坚持以用户体验优先的前提下,保持与行……B级车大战一触即发,新款雅阁PK凯美瑞,谁更值得入手?咱们国内的B级车市场可以说是竞争激烈,可谓是百家争鸣,而大众帕萨特、本田雅阁、丰田凯美瑞跟日产天籁更是其中的佼佼者,深受消费者的喜爱。而今天就给大家说一说谁才是日系B级车之王。……电视行业洗牌在即OPPO能否分到一杯羹?第一观察讯(刘冉)电视行业已经悄悄发生改变,更多的消费者选择互联网电视品牌,其中华为和小米已经成为消费者的首选。10月19日,OPPO也发布首款电视产品。海信、TCL、创……iQOO,红米迎来强有力的对手realmeGTNeo2,骁龙今天下午两点,全球最年轻成长最快的智能手机品牌realme发布了其得意之作realme真我GTNeo2,是一部主打游戏的非电竞手机。真我GTNeo2不仅有机能美学黑薄荷外观设计……秋季雨后树叶落在车上,对车子有哪些损害?进入十月份,一场秋雨一场凉,不少车主已经看到自己爱车上落上了不少树叶,不要只顾着欣赏秋景,快看看这些树叶是否有树胶。很多树木的树胶会黏在树叶上,如果伴随着秋雨一同落在车身……一文解读永不消逝的电波可折叠翻盖摩托罗拉Razr2021MOTORazr2Hello,MOTO永不消失的电波,从过去传来。可折叠就是未来的2021年,可折叠翻盖摩托罗拉Razr2系列让你高攀不起,此款售价为1199。99美元,……突出显示excel2007表格重复值数据教程有时候我们看到一些数据需要把重复的数据显示出来,这样方便我们对照和查看,那么我们该如何突出显示excel2007表格重复值数据呢?其实非常的简单,具体操作如下:1、选中需……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网