c 輸入輸出
當(dāng)我們提到輸入時(shí),這意味著要向程序填充一些數(shù)據(jù)。輸入可以是以文件的形式或從命令行中進(jìn)行。c 語言提供了一系列內(nèi)置的函數(shù)來讀取給定的輸入,并根據(jù)需要填充到程序中。
當(dāng)我們提到輸出時(shí),這意味著要在屏幕上、打印機(jī)上或任意文件中顯示一些數(shù)據(jù)。c 語言提供了一系列內(nèi)置的函數(shù)來輸出數(shù)據(jù)到計(jì)算機(jī)屏幕上和保存數(shù)據(jù)到文本文件或二進(jìn)制文件中。
1. 標(biāo)準(zhǔn)文件
c 語言把所有的設(shè)備都當(dāng)作文件。所以設(shè)備(比如顯示器)被處理的方式與文件相同。以下三個(gè)文件會(huì)在程序執(zhí)行時(shí)自動(dòng)打開,以便訪問鍵盤和屏幕。
標(biāo)準(zhǔn)文件 | 文件指針 | 設(shè)備 |
---|---|---|
標(biāo)準(zhǔn)輸入 | stdin | 鍵盤 |
標(biāo)準(zhǔn)輸出 | stdout | 屏幕 |
標(biāo)準(zhǔn)錯(cuò)誤 | stderr | 您的屏幕 |
文件指針是訪問文件的方式,本節(jié)將講解如何從屏幕讀取值以及如何把結(jié)果輸出到屏幕上。
c 語言中的 i/o (輸入/輸出) 通常使用 printf() 和 scanf() 兩個(gè)函數(shù)。
scanf() 函數(shù)用于從標(biāo)準(zhǔn)輸入(鍵盤)讀取并格式化, printf() 函數(shù)發(fā)送格式化輸出到標(biāo)準(zhǔn)輸出(屏幕)。
2. 實(shí)例
#include <stdio.h> // 執(zhí)行 printf() 函數(shù)需要該庫(kù) int main() { printf("碩編程"); //顯示引號(hào)中的內(nèi)容 return 0; }
編譯以上程序,輸出結(jié)果為:
碩編程
實(shí)例解析:
- 所有的 c 語言程序都需要包含 main() 函數(shù)。 代碼從 main() 函數(shù)開始執(zhí)行。
- printf() 用于格式化輸出到屏幕。printf() 函數(shù)在 "stdio.h" 頭文件中聲明。
- stdio.h 是一個(gè)頭文件 (標(biāo)準(zhǔn)輸入輸出頭文件) and #include 是一個(gè)預(yù)處理命令,用來引入頭文件。 當(dāng)編譯器遇到 printf() 函數(shù)時(shí),如果沒有找到 stdio.h 頭文件,會(huì)發(fā)生編譯錯(cuò)誤。
- return 0; 語句用于表示退出程序。
3. %d 格式化輸出整數(shù)
#include <stdio.h> int main() { int testinteger = 5; printf("number = %d", testinteger); return 0; }
編譯以上程序,輸出結(jié)果為:
number = 5
在 printf() 函數(shù)的引號(hào)中使用 "%d" (整型) 來匹配整型變量 testinteger 并輸出到屏幕。
4. %f 格式化輸出浮點(diǎn)型數(shù)據(jù)
#include <stdio.h> int main() { float f; printf("enter a number: "); // %f 匹配浮點(diǎn)型數(shù)據(jù) scanf("%f",&f); printf("value = %f", f); return 0; }
5. getchar() & putchar() 函數(shù)
int getchar(void) 函數(shù)從屏幕讀取下一個(gè)可用的字符,并把它返回為一個(gè)整數(shù)。這個(gè)函數(shù)在同一個(gè)時(shí)間內(nèi)只會(huì)讀取一個(gè)單一的字符。您可以在循環(huán)內(nèi)使用這個(gè)方法,以便從屏幕上讀取多個(gè)字符。
int putchar(int c) 函數(shù)把字符輸出到屏幕上,并返回相同的字符。這個(gè)函數(shù)在同一個(gè)時(shí)間內(nèi)只會(huì)輸出一個(gè)單一的字符。您可以在循環(huán)內(nèi)使用這個(gè)方法,以便在屏幕上輸出多個(gè)字符。
請(qǐng)看下面的實(shí)例:
#include <stdio.h> int main( ) { int c; printf( "enter a value :"); c = getchar( ); printf( "\nyou entered: "); putchar( c ); printf( "\n"); return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)等待您輸入一些文本,當(dāng)您輸入一個(gè)文本并按下回車鍵時(shí),程序會(huì)繼續(xù)并只會(huì)讀取一個(gè)單一的字符,顯示如下:
$./a.out enter a value :yapf you entered: c
6. gets() & puts() 函數(shù)
char *gets(char *s) 函數(shù)從 stdin 讀取一行到 s 所指向的緩沖區(qū),直到一個(gè)終止符或 eof。
int puts(const char *s) 函數(shù)把字符串 s 和一個(gè)尾隨的換行符寫入到 stdout。
#include <stdio.h> int main( ) { char str[100]; printf( "enter a value :"); gets( str ); printf( "\nyou entered: "); puts( str ); return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)等待您輸入一些文本,當(dāng)您輸入一個(gè)文本并按下回車鍵時(shí),程序會(huì)繼續(xù)并讀取一整行直到該行結(jié)束,顯示如下:
$./a.out enter a value :yapf you entered: yapf
7. scanf() 和 printf() 函數(shù)
int scanf(const char *format, ...) 函數(shù)從標(biāo)準(zhǔn)輸入流 stdin 讀取輸入,并根據(jù)提供的 format 來瀏覽輸入。
int printf(const char *format, ...) 函數(shù)把輸出寫入到標(biāo)準(zhǔn)輸出流 stdout ,并根據(jù)提供的格式產(chǎn)生輸出。
format 可以是一個(gè)簡(jiǎn)單的常量字符串,但是您可以分別指定 %s、%d、%c、%f 等來輸出或讀取字符串、整數(shù)、字符或浮點(diǎn)數(shù)。還有許多其他可用的格式選項(xiàng),可以根據(jù)需要使用。如需了解完整的細(xì)節(jié),可以查看這些函數(shù)的參考手冊(cè)?,F(xiàn)在讓我們通過下面這個(gè)簡(jiǎn)單的實(shí)例來加深理解:
#include <stdio.h> int main( ) { char str[100]; int i; printf( "enter a value :"); scanf("%s %d", str, &i); printf( "\nyou entered: %s %d ", str, i); printf("\n"); return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)等待您輸入一些文本,當(dāng)您輸入一個(gè)文本并按下回車鍵時(shí),程序會(huì)繼續(xù)并讀取輸入,顯示如下:
$./a.out enter a value :yapf 123 you entered: yapf 123
在這里,應(yīng)當(dāng)指出的是,scanf() 期待輸入的格式與您給出的 %s 和 %d 相同,這意味著您必須提供有效的輸入,比如 "string integer",如果您提供的是 "string string" 或 "integer integer",它會(huì)被認(rèn)為是錯(cuò)誤的輸入。另外,在讀取字符串時(shí),只要遇到一個(gè)空格,scanf() 就會(huì)停止讀取,所以 "this is test" 對(duì) scanf() 來說是三個(gè)字符串。