数据类型 与 标准IO

来源:互联网 发布:制造企业数据库特点 编辑:程序博客网 时间:2024/05/22 02:02

/*
    数据类型 与 标准IO

A,数据类型

    1,GCC中float=4,double=8,long double=12
    2,VC2010中,float=4,double=8,long double =8
    3,关于数据范围:int(32位)大概是21亿不到22亿(10个数), long大概是900京(19个数)
                float(32位)小数位为6,且四舍五入, double(32位) 小数位17位,且四舍五入,long double(32位)小数位17位,且四舍五入
    4,在VC10中,long double就是double。GCC中不是, GCC是12个字节。
    5,Intel的CPU采用小端(低为低)存储,int a=0x12345678;则低地址为0x78;

    6,如果数据定义为局部变量,那么不会被初始化,比如,在main中,int a;那么a不会为0. 如果定义为全局变量,那么a=0。结构体也一样。

B,printf格式控制

    表达式:%[-][0][m.n][l或h]格式字符
    1, “ % ” 是必须的
    2,“ - ” 表示左对齐,没有表示右对齐
    3,“ 0 ” 表示0填充,没有表示空白填充
    4,“ m.n ” 表示所占宽度m,精度为n
    5,“ l ” 表示long, “ h ”表示short
    6,格式字符

    7,printf时,long double 对应Lf。 double与float 对应f或者lf或者llf或者llll..lllf。(float会自动扩展为double)
    8,printf时,long 对应ld, long long 对应lld。l与L无区别

C,scanf:(好像只有scanf是这样)
   
    1,换行(/n)垃圾:
        首先理解缓存区的机制:当用户输入时,输入数据不会被函数直接读入,而是被读入到缓存区,当敲回车时,会读入缓存区一个'/n'后,触发IO函数读取缓存区。
    读取%d,%s等时,IO函数扫描缓存区,过滤碰到割断(空格或者/n),然后读取数据,直到再碰到隔断,这是处理隔断之间的数据,但后面的隔断不会从缓存区清空
    ,而是留下来。如果后面要读取的是一个%c,那么这个隔断会被作为字符读入。而如果是%d或者%s等,则会过滤隔断。所以对于%c才会产生垃圾。
   
        举例1:char a,b; scanf("%c", &a); scanf("%c", &b);
            输入 a<CR>
            过程分析:<CR>触发scanf处理缓存区。缓存区中为['a' '/n' ], scanf按%c,读取‘a’到char a中,然后返回。这时,缓冲区中为['/n'],
            scanf读取缓冲区,将‘/n’赋给char b;
        举例2:char buf[100]; char c; scanf("%s", buf); scanf("%c", &c);
            输入:123abc<SPACE>e<CR>
            过程分析:<CR>触发scanf处理缓存区。scanf从缓存区中扫描,碰到隔断<SPACE>,将隔断前的字符串赋给buf。这是<SPACE>并不被处理,然后scanf读取char c。
            这时把<SPACE>赋给char c。

        举例3: char c; int b; scanf("%c", &c); scanf("%d", &b);
            输入:a<CR>12<CR>
            过程分析:<CR>触发scanf处理缓冲区,a被读入char c中,读取int b时,a后面的<CR>被过滤掉,直到碰到其他有效输入,这是12被读入b中。
        举例4:可以正常读入 scanf("%c", &a);scanf(" %c", &b); 或者scanf("%c ", &a);scanf("%c", &b);
        举例5:char a; char c; scanf("abc%c efg", &a); scanf("%c", &c);
            输入:abcd<CR>efgh<CR>, 最终结果为a=‘d’,c=‘h’
            输入:abd,最终结果是 scanf扫描缓冲区,先过滤a,再b,过滤c的时候,发现输入串不合法,所以第一个scanf返回0结束,
        第二个scanf读入d给char c。

        综上:scanf不过为%c过滤之前的'/n'、空格等字符。但是会为%s、%d等过滤。且scanf读入数据后,不会丢弃掉/n、空格等字符,依然将它们留在缓冲区内。
            gets()函数不会这样.
    2,scanf时,float 只对应f,double只对应lf,long double只对应LF或者llf。
    3,scanf的返回值表示成功读入的数据个数
    4, scanf(" %c", &c); %c之前有个空格,会帮助在读取%c时,先过滤之前的换行空格等字符,再读入c中,即过滤了垃圾.
     
D,其他

    1,getch从键盘直接读入,不用回车键
    2,scanf从缓存区读入,逐字符扫描,直到空格(32)和新行(10),将扫描区间处理。
    3,gets从缓冲区读入,不以空格(32)为结束标志。只以新行(10)为标志。有点像getLine
    4,putch
    5,puts

    文件 I/O
A,常见IO函数
    0, putch, getch, puts, gets, printf, scanf, getchar
    1, fputc, fgetc, fputs, fgets, fprintf, fscanf
    2, putw, getw, fread, fwrite
    3, feof, ferror, clearerr
    4, ftell, rewind, fseek
    5, fflush, freopen
    6, rename, remove, tmpnam

    4, 不适用gets,适用fgets(pBuf, 12, stdin), where pBuf is a char*, and 12 is size of Buf. read 11 symbols from stdin
    6, fgets() 会在结尾处多读一个'/n'

关于回车换行:
    1,内存里:‘/n’解释为 new line 更好,而不是换行。 回车(‘/r’)表示表示光标回到本行开头,而不换行。‘/n’表示新的一行,实际为回车换行。
        敲回车后,会产生/n字符到缓存区中,并触发处理缓存区的动作,动作完毕后,清空缓存区。
    2,文本里:windows把‘/n’存储到硬盘时,自动扩展为‘/r/n’.读取时,自动把‘/r/n’读成为‘/n’(文本模式下).而linux不这样。

*/

原创粉丝点击