c51 函式庫函式 STDIO.H:一般I/O函式
c51 函式 (3)
3.2 STDIO.H:一般I/O函式
在標頭檔案中增加include <stdio.h>
C51編譯器包含字元I/O函式,它們通過處理器的序列介面操作,為支援其它I/O機制,只需修改_getkey()和putchar()函式,其它所有I/O支援函式依賴這兩個模組,不需要改動。在使用8051序列口之前,必須將它們初始化,下例以2400波特率,12MHz初始化串列埠:
SCON=0x52
TMOD=0x20
TR1=1
TH1=0Xf3
其它工作模式和波特率等細節問題可以從8051使用者手冊中得到。
函式名: _getkey
原 型: extern char _getkey();
功 能: _getkey()從8051串列埠讀入一個字元,然後等待字元輸入,這個函式是改變整個輸入埠機制應作修改的唯一一個函式。
函式名: getchar
原 型: extern char _getchar();
功 能: getchar()使用_getkey從串列埠讀入字元,除了讀入的字元馬上傳給putchar函式以作響應外,與_getkey相同。不是說具有回顯功能。
函式名: gets
原 型: extern char *gets(char *s,int n);
功 能:該函式通過getchar從控制檯裝置讀入一個字元送入由‘s’指向的資料組。考慮到ANSI標準的建議,限制每次呼叫時能讀入的最大字元數,函式提供了一個字元計數器‘n’,在所有情況下,當檢測到換行符時,放棄字元輸入。
函式名: ungetchar
原 型: extern char ungetchar(char);
功 能: ungetchar將輸入字元推回輸入緩衝區,因此下次gets或getchar可用該字元。ungetchar成功時返回‘char’,失敗時返回EOF,不可能用ungetchar處理多個字元。
函式名: _ungetchar
原 型: extern char _ungetchar(char);
功 能: _ungetchar將傳入字元送回輸入緩衝區並將其值返回給呼叫者,下次使用getkey時可獲得該字元,寫回多個字元是不可能的。
函式名:putchar
原 型: extern putchar(char);
功 能: putchar通過8051串列埠輸出‘char’,和函式_getkey一樣,putchar是改變整個輸出機制所需修改的唯一一個函式。
函式名: printf
原 型: extern int printf(const char*,…);
功 能: printf以一定格式通過8051串列埠輸出數值和串,返回值為實際輸出的字元數,參量可以是指標、字元或數值,第一個參量是格式串指標。
注:允許作為printf參量的總位元組數由C51庫限制,因為8051結構上存貯空間有限,在SMALL和COMPACT模式下,最大可傳遞15個位元組的引數(即5個指標,或1個指標和3個長位元組),在LARGE模式下,至多可傳遞40個位元組的引數。格式控制串包含下列域(方括號內的域是可能的):
%[flags][width][.precision]type
“width”域定義了參量欲顯示的字元數(即顯示寬度),它必須是一個十進位制數,如果實際顯示的字元數小於“width”,輸出左端補以空格,如果“width”域以0開始,則左端補0。如%05d,則顯示5位十進位制數,若不足5位,則左端以0補齊。
“flag”域用來定義下面選項:
Falg意義-輸出左齊+輸出值如果是有符號數值,則加上+/-號‘ ‘(空格),輸出值如果為正則左邊補以空格顯示#,如果它與0,x或X聯用,則在輸出前加上字元0、0x,0X。當與值型別g、G、f、e、E聯用時,‘#’使輸出數產生一個十進位制小數點。
b,B它們與格式型別d、i、o、u、x、X聯用,這樣參量型別被接受為‘[unsigned]char’,如:%bu,%bd或%bx。
l,L它們與格式型別d、i、o、u、x、X聯用,這樣參量型別被接受為‘[unsigned]long’,如:%lu,%ld或%lx。
*下一個參量不作輸出。型別d,表示int型別,u表示unsigned int型別
“type“域定義參量如下型別:
字元型別輸出格式dint有符號十進位制數(16位),Uint無符號十進位制數,oint無符號八進位制數X,xint無符號十六進位制數ffloat[-]dddd.dddd形式的浮點數e,Efloat[-]d.ddddE[sign]dd形式的浮點數g,Gfloate或f形式浮點數,看哪一種輸出形式好。cchar字元spointer指向一個帶結束符號的串ppointer帶存貯器指示符和偏移的指標。M:aaaa。M:=C(ode),D(ata),I(data),P(data) aaaa:指標偏移值。
例子:
printf(“Int-Val%d,Char-Val%bd,Long-Val%d”,I,c,l);
printf(“String%s,Character%c”,array,character);
printf(“Pointer%p”,&array[10]); 打印出指標地址
函式名: sprintf
原 型: extern int sprintf(char *s,const char*,…);
功 能: sprintf與printf相似,但輸出不顯示在控制檯上,而是通過一個指標S,送入可定址的緩衝區。
注:sprintf允許輸出的參量總位元組數與printf完全相同。
函式名: puts
原 型: extern int puts(const char*,…);
功 能: puts將串‘s’和換行符寫入控制檯裝置,錯誤時返回EOF,否則返回一非負數。
函式名: scanf
原 型: extern int scanf(const char*,…);
功 能: scanf在格式串控制下,利用getchar函式由控制檯讀入資料,每遇到一個值(符號格式串規定),就將它按順序賦給每個參量,注意每個參量必須都是指標。scanf返回它所發現並轉換的輸入項數。若遇到錯誤返回EOF。格式串包括:
l 空格、製表符等,這些空白字元被忽略。
l 字元,除需匹配的“%”(格式控制字元)外。
l 轉換指定字元“%”,後隨幾個可選字元;賦值抑制符“*”,一個指定最大域寬的數。
注:scanf參量允許的總位元組數與printf相同,格式控制串可包括下列域(方括號內是可選的):
%[flags][width]type
格式串總是以百分號開始,每個域包含一個或多個字元或數。
“width”域定義了參量可接受的字元數,“width”必須是一個正十進位制數。如果實際輸入字元數量小於“width”,則不會進行填充。
‘flag’域用來定義下面選項:
Flag意 義*輸入被忽略b,h它們用作格式型別d,i,o,u和x的字首,用這些變數可定義參量是字元指標還是無符號字元指標。如%bu,%bd,%bx。L它們被作格式型別d,i,o,u和x的字首,使用這個字首可定義參量是長指標還是無符號字長指標。如%lu,%ld,%lx。
“type”域定義參量為如下型別:
描 述 符類 型輸 入 格 式dptr to int有符號十進位制數(16位)iptr to int如C中記號一樣,整型值uptr to int無符號十進位制數optr to int無符號八進位制數xptr to int無符號十六進位制數f,e,gptr to float浮點數cptr to char一個字元sptr to string一個字串
例子:
scanf(“%d%bd%ld”,&i,&c,&l);
scanf(“%f”,&f);
scanf(“%3s,%c”,&string[0],&character);
函式名: sscanf
原 型: extern int sscanf(const *s,const char*,…);
功 能: sscanf與scanf方式相似,但串輸入不是通過控制檯,而是通過另一個以空結束的指標。
注:sscanf參量允許的總位元組數由C-51庫限制,這是因為8051處理器結構記憶體的限制,在SMALL和COMPACT模式,最大允許15位元組引數(即至多5個指標,或2個指標,2個長整型或1個字元型)的傳遞。在LARGE模式下,最大允許傳送40個位元組的引數。