在我们平常写的c/c++程序,一些算法题中,我们常常会用到c标准库中string.h文件中的函数,这些函数主要用于处理内存,字符串相关操作,是很有用的工具函数.而且有些时候,在笔试或面试中也会出现让你来实现某个函数的情况(比如strcpy).而且里面有些函数时间长不用就生疏了,本文就是要全面回顾这些函数. 1.NULL NULL是一个宏,可以扩展为空指针常量.空指针常量是一个等于零的整数常量表达式,后者是如(void *)0一样的从0转换为空指针void *.(A null-pointer co…
我的strcat: char *strcat(char *dest,char *src) { char * reval = dest; while(*dest) dest++; while(*src) *dest++ = *src++ ; *dest = *src; return reval; } MSVC: char * __cdecl strcat ( char * dst, const char * src ) { char * cp = dst; while( *cp ) cp++; /…
接前文. 再来看看getc和ungetc的实现.在看这两个函数的实现之前,我们先来想一想这两个函数分别需要做的工作. int getc(FILE *stream) 说明:函数getc从stream指向的输入流中读取下一个字符(如果有的话),并把它由unsigned char类型转换为int类型,并且流的相关的文件定位符(如果定义的话)向前移动一位. 返回值:函数getc返回stream指向的输入流的下一个字符,如果流处于文件结束处,则设置该流的文件结束指示符,函数getc返回EOF.如果发生了读…
其他的库文件看起来没有什么实现层面的知识可以探究的,所以,直接来看stdio.h. 1.茶余饭后的杂谈,有趣的历史 在过去的几十年中,独立于设备的输入输出模型得到了飞速的发展,标准C从这个改善的模型中获益颇丰. 输入输出模块 在20世纪60年代早期,FORTRAN IV被认为是独立于机器的语言.但是如果不作任何改动,根本不可能在各种计算机体系结构中移动FORTRAN IV程序.可移植性的主要障碍是输入输出领域.在FORTRAN IV中,可以对FORTRAN IV代码中间的I/O语句中对正在通信的…
默默觉得原来的阅读笔记的名字太土了,改了个名字,叫做走进C标准库. 自己就是菜鸟一只,第一次具体看C标准库,文章参杂了对<the standard C library>的阅读和对源码的一些个人浅显理解,自己记录一下,日后有机会来看可能有另一番感悟吧. assert.h assert宏定义的两种表达方式: #define assert(exp) ((exp) ? (void)0 : _assert(msg)) #define assert(exp) (void)( (exp) || _asser…
所谓的 C 标准库(C standard library),是指在 ISO C 或者 POSIX 标准中定义的: POSIX is a superset(超集) of the standard C library, and it's important to note that it defers to it. If C and POSIX is ever in conflict, C wins. 1. conio.h conio 是 Console Input/Output (控制台输入输出)…
花了点时间把园子弄得好看了点,现在继续. 函数名: putc 功  能: 输出一字符到指定流中 用  法: int putc(int ch, FILE *stream); #define _putc_lk(_c,_stream) (--(_stream)->_cnt >= 0 ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) : _flsbuf((_c),(_stream))) 看到这个宏是否觉得很熟悉,很像getc的宏吧. 那么,很容易产生一…
函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, char *type, FILE *stream); FILE * __cdecl _tfreopen ( const _TSCHAR *filename, const _TSCHAR *mode, FILE *str ) { REG1 FILE *stream; FILE *retval; _AS…
我写的memchr: void *memchr(const void *buf, char ch, unsigned count){ unsigned ; while(*(buf++) != ch && cnt <= count){cnt++;} if(cnt > count) return NULL; else return buf; } 红色部分报错. 该错误为为ANSIC中认定的错误,是因为它坚持:进行算法操作的指针必须是确定知道其指向数据类型大小的. 但是GNU则不这么…
我的memcmp: int memcmp(void *buf1, void *buf2, unsigned int count){ int reval; while(count && !(reval = (*(unsigned char *)buf1) - (*(unsigned char *)buf2))) { buf1 = (unsigned ; buf2 = (unsigned ; --count; } return reval; } MS VC: int __cdecl memcm…