1.一些被认作函数的宏
ctype.h中的islower(),isupper()等; stdio.h中的putchar(),getchar()等,都是宏,而不是函数。
比如putchar():
__CRT_INLINE int __cdecl __MINGW_NOTHROW putchar(int __c)
{
return (--stdout->_cnt >= 0)
? (int) (unsigned char) (*stdout->_ptr++ = (char)__c)
: _flsbuf (__c, stdout);}
//它们的返回值是已经定义好的,如果表达式为假,返回0,为真: /* * The following flags are used to tell iswctype and _isctype what character * types you are looking for. */ #define _UPPER 0x0001 #define _LOWER 0x0002 #define _DIGIT 0x0004 #define _SPACE 0x0008 /* HT LF VT FF CR SP */ #define _PUNCT 0x0010 #define _CONTROL 0x0020
2.关于printf的一个测试
正确运行,但是不规范。
#include <stdio.h> #define MAXSIZE 10 int main(){ char s[13] = "hello, world"; printf(s); return 0; }
3.%c与%1s的测试
char str[13]; scanf("%1s", str); char s; scanf("%c", &s);
4.FILE的定义
#ifndef _FILE_DEFINED struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE; #define _FILE_DEFINED #endif
5.标准输入输出
每一个程序再运行的时候,操作系统都会打开三个文件:stdin, stdout, stderr.分别是标准输入,标准输出,标准错误。如果用不到,这三个文件可以关闭,再次使用可以使用freopen重新打开。
注:_CRTIMP FILE * __cdecl freopen(const char *, const char *, FILE *);
#include <stdio.h> #define MAXSIZE 10 int main(){ char c = 'o'; char str[MAXSIZE]; fclose(stdin); //关闭 fclose(stdout); printf("1:%c\n", c); //输出流已关闭,不会有输出 scanf("%s", str); //输入流关闭,同样不会等你从控制台输入 printf("1:%s\n", str); //输出流已关闭,不会有输出 freopen("CON", "r", stdin); //关闭 freopen("CON", "w", stdout); printf("2:%c\n", c); scanf("%s", str); printf("2:%s\n", str); return 0; }

运行结果
6.ferror
定义:#define ferror(__F) ((__F)->_flag & _IOERR)
其中,__F 定义为FILE *__F
ferror,函数名,在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。
7.ferror的孪生兄弟feof
#define feof(__F) ((__F)->_flag & _IOEOF)
检查是否到达文件末尾
8.exit
函数名: exit()
所在头文件:stdlib.h
功 能: 关闭所有文件,终止正在执行的程序。
void exit( int );
Exit(0)正常退出;
Exit(x), x ≠0,异常退出。
9.calloc与malloc的小区别
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
calloc 等效于 malloc + memset.当不需要清空时,自然malloc更高效。
10.free
free()的功能就是把malloc、calloc动态分配的内存回收到“未分配的内存”。当然内存并不是向下面这幅图,内存的管理分配也没这么简单,分配的内存和未分配的内存更不可能被分开。这幅图抽象成这样,仅仅是为了理解。
此文章上半部分在介绍free机制,下面的就深入到stl了。
http://blog.youkuaiyun.com/sunmenggmail/article/details/7888763

11.isupper


这与函数相比,减少了调用函数的开销.但是,必须注意一些问题.
char *p = "This is a string";
if(isupper(*p++))实际为:
((*p++) >= 'A' && (*p++) <= 'Z') ? 1 : 0;
造成对指针p进行2次递增操作。应使用:
if(isupper(*p){
….
p++;
}
函数形式:
int isupper(char c)
{
If (c >='A' && c <= 'Z')
return 1;
else
Return 0;
}
ctype.h 中的定义:
#define _UPPER 0x0001 #define __ISCTYPE(c, mask) (MB_CUR_MAX == 1 ? (_pctype[c] & mask) : _isctype(c, mask)) __CRT_INLINE int __cdecl __MINGW_NOTHROW isupper(int c) {return __ISCTYPE(c, _UPPER);}
这里isupper是函数,很“安全”。