another test

目录:
1.一些被认作函数的宏
2.关于printf的一个测试
3.%c与%1s的测试
4.FILE的定义
5.标准输入输出
6.ferror
7.ferror的孪生兄弟feof
8.exit
9.calloc与malloc的小区别
10.free
11.isupper




----------------------------------------------------------------------------------------------------------------------

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; }

The C Programming Language(5) - life@happiness - life@happiness的博客

 运行结果


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.callocmalloc的小区别

calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

calloc 等效于 malloc + memset.当不需要清空时,自然malloc更高效。


10.free

 free()的功能就是把malloccalloc动态分配的内存回收到“未分配的内存”。当然内存并不是向下面这幅图,内存的管理分配也没这么简单,分配的内存和未分配的内存更不可能被分开。这幅图抽象成这样,仅仅是为了理解。

 

此文章上半部分在介绍free机制,下面的就深入到stl了。

http://blog.csdn.net/sunmenggmail/article/details/7888763

The C Programming Language(5) - life@happiness - life@happiness的博客

 

11.isupper

The C Programming Language(5) - life@happiness - life@happiness的博客
The C Programming Language(5) - life@happiness - life@happiness的博客

 

这与函数相比,减少了调用函数的开销.但是,必须注意一些问题.

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是函数,很“安全”。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值