數據類型 與 標準IO

/*
    數據類型 與 標準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不這樣。

*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章