C語言(三)---輸入和輸出
一、輸出
輸入輸出:英文是Input/Output簡稱IO。
C語言標準函數庫中,提供了關於以下介紹的幾種輸出函數,(所有標準輸入輸出函數在調用前,必須先包含頭文件stdio.h)
1.1 簡單字符輸出
1.1.1 putchar函數
putchar函數:將指定的(表達式的值所對應的)字符輸出到標準輸出終端(屏幕)上。
格式:int putchar( int c );
返回值:返回已寫好的字符。 若要指示錯誤或文件結尾條件,putchar 返回 EOF;
例如:putchar(‘a’+3);打印的結果是d,是一個字符而不是數值。
a的ASCII碼是97,加3是ASCII碼表中100對應的字符就是d。
例如:putchar(99);打印的結果是c,代入一個數字打印出的是一個字符。
就如同代入的是學號,打印出來的是姓名一樣。
1.1.2 putc函數
putc函數:將指定的字符輸出到指定標準輸出流(屏幕或一個文件)中。
格式:int putc( int c, FILE *stream );
等價關系:putc的功能中包含putchar的功能。
putchar(c)等價於putc(c,stdout)。
例如:putc(‘A’,stdout)等價於putchar(‘A’)
1.1.3 fputc函數
- 函數原型:int fputc( int c, FILE *stream );
- 參數:
- c:要寫入的字符。
- stream:指向 FILE 結構的指針。
- 返回值:返回一個寫好的字符。EOF 的返回值指示錯誤
- 與 putc等效,但是僅實現為函數,而不是函數和宏。
1.2 多種格式輸出
1.2.1 printf函數
c語言中格式化輸出的函數,用於向終端(屏幕)要輸出的的各種類型的數據的常量或變量,除了可以輸出字母、數字、空格和一些數字符號以外,還可以使用一些轉義字符表示特殊的含義。
格式:int printf( const char *format [, argument]... );
- printf函數打印時的占位控制:
- 在printf函數的控制串內,%符號與控制符之間的數字是用來控制占位的。例如:printf(“%8.3f”,34.678f);8代表包括小數點總共占用8個空位,.3代表保留3位小數打印。
- %之後帶-符號代表在所占用的空間內左對齊,缺省不帶-符號是右對齊。例如:printf(“價格=%-8.3f”,34.67f);還是占用8個空位但是,與前面不同之處是左對齊。
- 如果%後面是0.x代表不占用多余空位,只控制保留的小數位。例如:printf(“價格=%0.3f”,34.6f);以上是printf函數對於浮點數的占位和對其管理。
- 對於整數和字符串輸出只有占位控制和對齊控制,沒有小數點後面的控制。例如:printf(“學號:%-8d姓名:%-10s\n”);8和10代表的是占位管理,-符號代表左對齊,缺省不帶-符號是右對齊。
printf 類型字段字符:
類型字符 |
參數 |
輸出格式 |
---|---|---|
c |
字符 |
與 printf 函數一起使用時,指定單字節字符;與 wprintf 函數一起使用時,指定寬字符。 |
C |
字符 |
與 printf 函數一起使用時,指定寬字符;與 wprintf 函數一起使用時,指定單字節字符。 |
d |
Integer |
帶符號十進制整數。 |
i |
Integer |
帶符號十進制整數。 |
o |
Integer |
無符號八進制整數。 |
u |
Integer |
無符號十進制整數。 |
x |
Integer |
無符號十六進制整數;使用“abcdef.” |
X |
Integer |
無符號十六進制整數;使用“ABCDEF.” |
e |
浮點 |
有符號的值,形式為 [ – ]d .dddd e [ sign]dd[d],其中 d 是一個十進制數,dddd 是一個或多個十進制數,dd[d] 是兩三個十進制數,具體取決於 輸出格式和指數大小,並且 符號為 + 或 –。 |
E |
浮點 |
與 e 格式相同,除非 E(而非 e)引入了指數。 |
f |
浮點 |
有符號的值,形式為 [ – ]dddd .dddd,其中 dddd 是一個或多個十進制數。 小數點前的數字位數取決於數字的度量值,小數點後的數字位數取決於所需精度。 |
g |
浮點 |
有符號的值顯示為 f 或 e 格式,取其中對於給定的值和精度更為精簡一個。 僅當值的指數小於 -4 或大於等於 precision 參數時,使用 e 格式。 截去尾隨零,僅當後跟一個或多個數字時,才會顯示小數點。 |
G |
浮點 |
與 g 格式相同,除非 E(而非 e)引入指數(如果適用)。 |
a |
浮點 |
有符號十六進制雙精度浮點值,形式為 [?]0x h.hhhh p±dd,其中 h.hhhh 是尾數的十六進制數(使用小寫字母),dd 是指數的一個或多個數字。 精度指定此點後的數字位數。 |
A |
浮點 |
有符號十六進制雙精度浮點值,形式為 [?]0X h.hhhh P±dd,其中 h.hhhh 是尾數的十六進制數(使用大寫字母),dd 是指數的一個或多個數字。 精度指定此點後的數字位數。 |
n |
指向整數的指針 |
目前成功寫入流或緩沖區的字符數。 此值存儲在地址作為參數的整數中。 請參閱下文中的安全說明。 |
p |
指針類型 |
將參數顯示為十六進制數中的地址。 |
s |
字符串 |
與 printf 函數一起使用時,指定單字節或多字節字符串;與 wprintf 函數一起使用時,指定寬字符字符串。 於第一個空字符之前或達到 precision 值之前,顯示字符。 |
S |
字符串 |
與 printf 函數一起使用時,指定寬字符字符串;與 wprintf 函數一起使用時,指定單字節或多字節字符串。 於第一個空字符之前或達到 precision 值之前,顯示字符。 |
Z |
ANSI_STRING 或 UNICODE_STRING 結構 |
當 ANSI_STRING 的地址或 UNICODE_STRING 結構作為參數傳遞時,顯示包含在緩沖區中的字符串(此結構的 Buffer 字段指向此緩沖區)。 使用 w 的長度修飾符前綴指定 UNICODE_STRING 參數,例如 %wZ。 結構的 Length 字段必須設置為字符串的長度(以字節為單位)。 結構的 MaximumLength 字段必須設置為緩沖區的長度(以字節為單位)。 通常情況下,Z 類型字符僅在使用格式規範(如 dbgPrint 和 kdPrint)的驅動程序調試函數中使 |
二、輸入
2.1 多種格式輸入---scanf函數
scanf函數:格式化輸入函數,即按控制字符串內指定的各種格式,從鍵盤上把數據輸入到指定的變量之中。
格式:int scanf( const char *format [,argument]... );
format:窗體控件字符串。
argument:可選參數。
返回成功轉換和賦值的字段數;返回值不包括讀取,但未賦值的字段。 返回值為 0 表示未分配字段。
- 與printf相同之處是:
- 控制字符串內的每個%後面必須跟一個控制字符,參數列表中的參數都必須與控制字符的個數和類型相匹配
- 與printf的不同之處是:
- scanf的參數列表中,每一個變量之前都必須要帶上取地址符號(&)。代表要將參數列表中所有變量的地址一一傳遞給系統,操作系統要按照給定變量的地址,將用戶輸入的數據傳遞給參數列表中每一個對應的變量。(只有數組變量可以不用取地址,因為數組變量自身就是一個內存地址。printf的參數列表中,所有變量是不用取地址直接代入的。如果scanf函數像直接代入變量不取地址,執行時會因數據送錯地址造成整個程序崩潰。
- scanf的控制字符串內除了控制字符以外,只能指定間隔符空格或逗號。不能像printf函數那樣,隨意在控制字符之間夾雜其他的文字。
2.2 字符輸入
2.2.1 getc
getc函數:int getc( FILE *stream );
stream 輸入流。
返回值:返回讀取的字符。若要指示讀取錯誤或文件結束的條件,getc 返回EOF
2.2.2 getchar
getchar函數:從stdio流中讀字符,它從標準輸入裏讀取下一個字符。
格式:int getchar(void);
int c = getchar();
等價於:int c=getc(stdin)
也等價於:int c;scanf(“%c”,&c);
以上三中形式單獨調用時,最好在之前調用一個函數來清理輸入流:fflush(stdin);否則,可能獲取不到新輸入的內容,而是獲得了上一次輸入時的回車符。
三、字符串輸入輸出
3.1輸入函數
3.1.1 gets 函數
gets函數:從stdin流中讀取字符串,類似於scanf(“%s”,&x);
- 函數原型:char *gets( char *buffer );
- 參數:buffer 輸入字符串的存儲位置。
- 返回值:如果成功,返回參數。錯誤返回NULL
- gets 函數從標準輸入流 stdin 中讀取一行並保存在 buffer中. 行包含所有字符模式將匹配第一個換行符 (“\n”)。 gets 在返回行之前使用 null 字符 (“\0 ")然後替換換行符。相反,fgets 函數保留換行符。
3.1.2 fgets 函數
- 函數原型:char *fgets( char *str, int n, FILE *stream );
- 參數:
- str:數據的存儲位置
- n:要讀取的最大字符數
- stream:指向FILE結構的指針
- 返回值:成功,返回打印出的字符串;失敗返回NULL
fgets 函數讀取輸入 stream 參數的字符串並將其存儲到 str中。 fgets 讀取從當前流位置的字符,並且包括第一個字符,到流的末尾,或直至讀取字符數 - 1 與 n 相等。 存儲在 str 中追加 null 字符。 如果讀取,換行字符包括在字符串中。
3.2 輸出函數
3.2.1 puts函數
- puts函數:用來向標準輸出設備寫字符串並換行,類似於printf(“%s\n”,x);
- 函數原型:int puts( const char *str );
- 參數:str 輸出字符串
- 返回值:如果成功返回非負值。失敗返回EOF
puts 函數寫入 str到標準輸出流 stdout,替換字符串的終止 null 字符 (“\0 ") 將一個換行符 (“\n”) 在輸出流。
3.2.2 fputs函數
- 函數原型:int fputs( const char *str, FILE *stream );
- 參數:
- str 輸出字符串
- stream 指向 FILE 結構的指針
- 返回值:成功返回一個非負值,失敗,返回EOF
四、關鍵字
4.1 sizeof---獲取類型的大小(以字節為單位)
用法:對於所有其他類型(包括結構),sizeof 運算符只能在不安全代碼塊中使用。
sizeof unary-expression sizeof ( type-name )
sizeof 運算符的結果為 size_t 類型,它是包含文件 STDDEF.H 中定義的整數類型。 利用此運算符,你可以避免在程序中指定依賴於計算機的數據大小。
sizeof 的操作數可以是下列項之一:
類型名稱。 若要將 sizeof 用於類型名稱,則該名稱必須用括號括起。
一個表達式。 當用於表達式時,無論是否使用括號都可指定 sizeof。 不計算表達式。
當 sizeof 運算符應用到 char 類型的對象時,它將生成 1。 當 sizeof 運算符應用到數組時,它將產生該數組的字節總數,而非由數組標識符表示的指針的大小。 若要獲取由數組標識符表示的指針的大小,請將其作為參數傳遞給使用 sizeof 的函數。
當 sizeof 運算符應用到 class、struct 或 union 類型時,結果為該類型的對象中的字節數,以及添加的用於在字邊界上對齊成員數據的任何填充。 結果不一定對應於通過將各個成員的存儲需求相加計算出的大小。
sizeof 運算符永遠不會產生 0,即使對於空類也是如此。
sizeof 運算符不能用於以下操作數:
-
函數。 (但是,sizeof 可應用於指向函數的指針。)
- 位域。
- 未定義的類。
- void 類型。
- 動態分配的數組。
- 外部數組。
- 不完整類型。
- 帶括號的不完整類型的名稱。
當 sizeof 運算符應用於引用時,結果與 sizeof 應用到對象本身時的結果相同。
如果某個未確定大小的數組是結構的最後一個元素,則 sizeof 運算符將返回沒有該數組的結構的大小。
sizeof 運算符通常用於通過使用以下形式的表達式計算數組中的元素數量:sizeof array / sizeof array[0]
// Constant value 4:
int intSize = sizeof(int);
4.2 _countof---計算靜態分配的數組中元素的數量。
函數原型:size_t _countof( array ); 返回數組中的元素個數 確保 array 實際上是數組,而不是指針。 在 C 中,如果 _countof 是指針,則 array 將生成錯誤結果。 在 C++ 中,如果 _countof 是指針,則 array 將無法編譯。 必須包含頭文件 stdlib.h
int s[20];
_countof(s); == sizeof(s)/sizeof(s[0]);
C語言(三)---輸入和輸出