<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 134,comments - 22,trackbacks - 0

    首先,這兩個函數(shù)不是C標準庫中的函數(shù),

    int getch(void)    //從標準輸入讀入一個字符,當你用鍵盤輸入的時候,屏幕不顯示你所輸入的字符。也就是,不帶回顯。
    int getche(void)    //從標準輸入讀入一個字符,鍵盤輸入的時候,屏幕顯示所輸入的字符。帶回顯。

    這兩個函數(shù)包含在頭文件conio.h中,需要記住的是conio.h不是C標準庫中的頭文件。Micorsoft 和 Borland的 C編譯器提供了conio.h,用來創(chuàng)建控制臺文本用戶界面。一般在Windows系統(tǒng)下安裝了VS、VC等,就可以包含conio.h頭文件。但是一般 在Unix、Linux系統(tǒng)中,/usr/include/中都沒有這個頭文件。

    getch和getche在等待用戶從鍵盤輸入的時候,用戶按下一個鍵后,不需要按回車,程序自動往下執(zhí)行。在Linux中,終端輸入在缺省情況下是被“一鍋端”的,也就是說整行輸入是被一起處理的。通常,這是一種人們所希望的方便的辦法,但它也意味著在讀入數(shù)據(jù)時必須按一下回車鍵表示輸入行結(jié)束后才能得到輸入的數(shù)據(jù)。在游戲中,很多都提供了“老板鍵”,它的實現(xiàn),就是利用了這兩個函數(shù)。

     

    其次,除了getch和getche,其他的都是C標準庫中的頭文件,包含在頭文件stdio.h中。

    
    
    int fgetc ( FILE * stream ); //從流stream中讀一個字符。可以將標準輸入stdin作為它的實參,這時候從標準輸入讀取一個字符。
    int getc(FILE * stream);     //和fgetc等效,由fgetc通過宏實現(xiàn)。
    int getchar ( void );     //從標準輸入stdin讀入一個字符,程序等待你輸入的時候,你可以輸入多個字符,回車后程序繼續(xù)執(zhí)行。
                                     //但getchar只讀入一個字符
    說明:getc、getchar都是通過宏定義借助fgetc實現(xiàn)。如getchar的實現(xiàn)為,#define getchar() fgetc(stdin)。
     
    char * fgets (char * str, int num, FILE *stream);
                     //從流stream中讀入最多num個字符到字符數(shù)組str中,當遇到換行符時、或讀到num-1個字符時停止。
                     //自動加上'\0'空字符結(jié)尾
    char * gets ( char * str ); //從標準輸入stdin讀取一個字符串,遇到換行或結(jié)束時候終止。
                     //不同于fgets,他沒有指定num,所以需要注意字符數(shù)組str的大小。
     
    說明: fgets和gets之間沒有宏定義的關系,彼此各自有自己的實現(xiàn)。蠕蟲病毒的實現(xiàn)就是函數(shù)gets的“功勞”。gets函數(shù)的任務是從流中讀入一個字符串。它的調(diào)用者會告訴它把讀入的字符串放在什么地方。但是,gets()函數(shù)并不檢查緩沖區(qū)大小,如果調(diào)用者提供了一個指向堆棧的指針,并且get()函數(shù)讀入的字符數(shù)量超過了超過了緩沖區(qū)的空間大小,get()會愉快地將多出來的字符繼續(xù)寫入到堆棧中,這就覆蓋了堆棧中原來的內(nèi)容。如:
    main()
    {
       
    char line[512];    //在程序的堆棧上分配512個字符的空間
       ...
       gets(line);        
    //蠕蟲病毒的入口,可以將惡意代碼通過多出來的數(shù)據(jù)寫入堆棧
    }

     

    建議不要用getch和getche,因為它們不是C標準庫中的函數(shù)。用它們寫出的程序可移植性差,不同的編譯器不保證可以包含conio.h。建議用fgets函數(shù)徹底替代gets函數(shù)。

     

    另外,絕大多數(shù)的這些get函數(shù),都有對應的put版本。

    int fputc ( int character, FILE * stream );

    int putc ( int character, FILE * stream );       //通過宏定義和fputc實現(xiàn)

    int putchar ( int character );        //通過宏定義實現(xiàn):#define putchar(c) fputc(c, stdout)

     

    int fputs ( const char * str, FILE * stream );

    int puts ( const char * str );

    說明:兩者之間無宏定義實現(xiàn)關系。puts(const char *str)近似等效于fputs(cosnt char *str, stdout),不同點是前者還輸出一個'\n'

     

    最后,關于EOF

    EOF是在stdio.h文件中定義的符號常量,值為-1。如,

    fputc函數(shù)返回一個值:如果輸出成功則返回值就是輸出的字符;如果輸出失敗,則返回一個EOF。 

    fgetc函數(shù)讀字符時遇到文件結(jié)束符,函數(shù)返回一個文件結(jié)束標記EOF。如果想從一個磁盤文件順序讀入字符并在屏幕上顯示,可以:

    ch = fgetc(fp);
    while(ch != EOF){
      putchar(ch);
      ch 
    = fgetc(fp);
    }

     

    注意,EOF不是可輸出字符,因此不能在屏幕上顯示。由于ASCII碼不可能出現(xiàn)-1,因此EOF定義為-1是合適的。當讀入的字符值等于-1(即 EOF)時,表示讀入的已不是正常的字符,而是文件結(jié)束符。但以上只適用于讀取文本文件的情況。現(xiàn)在ANSI C 已經(jīng)允許用緩沖文件系統(tǒng)處理二進制文件,而讀入某一個字節(jié)中的二進制數(shù)據(jù)的值有可能是-1,而這又恰好是EOF的值。這就出現(xiàn)了需要讀入有用數(shù)據(jù),卻處理 為“文件結(jié)束”。feof(fp) 用來測試fp所指向的文件當前狀態(tài)是否是“文件結(jié)束”。如果想順序讀入一個二進制文件數(shù)據(jù),可以:

    while(!feof(fp)){
       c 
    = fgetc(fp);
       ...

    posted on 2010-07-26 17:34 何克勤 閱讀(421) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: 国产精品亚洲а∨无码播放麻豆| a在线观看免费视频| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲AV成人一区二区三区观看| 亚洲国产精品自产在线播放| 污视频在线观看免费| 亚洲欧美日韩一区二区三区| 亚洲精品乱码久久久久久自慰| 国产在线观看片a免费观看| 国产亚洲福利精品一区二区| 老色鬼久久亚洲AV综合| 四虎影在线永久免费观看| 久久免费高清视频| 亚洲AV无码成人精品区日韩| 亚洲av综合av一区| 国产亚洲精品免费| 最近2019免费中文字幕视频三| 美女啪啪网站又黄又免费| 亚洲黄色在线视频| 亚洲男人的天堂一区二区| 日本妇人成熟免费中文字幕| 久久久久国色AV免费观看| 亚洲日韩精品无码专区加勒比☆ | 亚洲国产精品成人精品小说| 国产黄色一级毛片亚洲黄片大全| 成人A级毛片免费观看AV网站| a色毛片免费视频| 黄色毛片免费在线观看| 亚洲国产成人精品激情| 亚洲va无码手机在线电影| 免费观看午夜在线欧差毛片| 日本免费网址大全在线观看| 鲁大师在线影院免费观看| 国产精品1024在线永久免费| WWW亚洲色大成网络.COM| 亚洲1区1区3区4区产品乱码芒果 | 亚洲AV无码乱码在线观看富二代 | 国产精品福利片免费看| 亚洲免费网站观看视频| 亚洲一线产区二线产区精华| 亚洲成人激情在线|