這樣的**有什麼問題?首先,儲存char
c;
while((c = getchar()) != eof) ...
getchar
的返回值的變數必須是
int型。
eof是
getchar
返回的「超出範圍」的
特殊值,它跟
getchar
可能返回的其他任何字元值都不一樣。(在時新的系統上,檔案中已
經不再儲存真正的檔案結束符了,
eof只不過是乙個沒有更多字元的訊號而已。)
getchar
返 回的值必須儲存在乙個比
char
型大的變數中,這樣才能儲存所有的
char值和
eof。
像前面的**片段那樣將
getchar
的返回值賦給
char
可能產生兩種失敗情況。
(1)
如果char
型有符號而
eof(像通常那樣)定義為
-1,則十進位制值為
255的字元 (
'\377'
或'\xff'
)會被符號擴充套件,跟
eof比較的時候會相等,從而過早地結束輸入。
(2)
如果char
型無符號,則
eof會被截斷(扔掉最高位,可能變成
255或
0xff
)而不再 被識別為
eof,從而導致無休止的輸入2。
然而,如果
char
型有符號而輸入的又都是
7位的字元,則這個錯誤可能持續很長時間而 不被發現。(普通
char
型是否有符號由實現定義。) 問:
我有個讀取直到
eof的簡單程式,但是我如何才能在鍵盤上輸入那個
「\eof
」呢?我看
中定義的
eof是
-1,是不是說我該輸入
-1?
答:考慮一下就知道,你輸入的絕不能是
-1,因為
-1是兩個字元,而
getchar
每次讀入乙個字
符。事實上,在你的
c程式中看到的
eof值和你在鍵盤上發出檔案結束符的按鍵組合之間並沒有
什麼關係。
eof不過是向程式發出的乙個訊號,指明輸入不再有任何字元了,不論什麼原因(磁 盤檔案結束、使用者結束輸入、網路流關閉和
i/o錯誤等。)根據你的作業系統,你可能使用不同 的按鍵組合來表示檔案結束,通常是
ctrl-d
或ctrl-z
。作業系統和標準輸入輸出庫安排你的程式 接收
eof值。(然而請注意,這一路有好幾個轉換。通常情況下,你不能自己檢查
ctrl-d
或ctrl-z
值,你在
stdio.h
檔案中也不會發現
eof巨集定義成了這樣的值。) 問:
如何在printf
的格式串中輸出乙個'%
'字元?我試過
\%,但是不行。
答:只需要重複百分號:
%%。
用printf輸出%之所以困難是因為%正是printf的轉義字元。任何時候printf遇到%, 它都會等待下乙個字元,然後決定如何處理。而雙字串行%%就被定義成了單獨的%字元。 要理解為什麼\%不行,得知道反斜槓\是編譯器的轉義字元,它控制編譯器在編譯時對源 **中字元的解釋。而這裡我們的問題是printf如何在執行時控制它的格式串。在編譯器 看來,\%可能沒有定義或者代表乙個%字元。就算printf會對\特殊處理,\和%在printf中
都有效的可能性也不大。 問:
為什麼scanf("%d", i)
呼叫不行?
答:傳給
scanf
的引數必須是指標:對於每個轉換的值,
scanf
都會寫入你傳入的指標指向的位
置(參見問題
20.1
。)。改為
scanf("%d", &i)
即可修正上面的問題。 問:
為什麼這些**不行?
double d;
scanf("%f", &d);答:跟
printf
不同,scanf
用%lf
代表double
型,用%f
代表float
型。1
%f格式告訴
scanf
準 備接收
float
型指標,而不是你提供的
double
型指標。要麼使用
%lf,要麼將接收變數宣告為
float
。
C 的標準輸入 輸出庫 iostream
standard i o stream c 的標準輸入 輸出庫 iostream 不僅提供了i o庫,還提供了使用庫的流模式 cin 流入和 cout 流出到輸出裝置的操作符 1.流狀態 stream states 1st showpos 在正數 含0 前顯示 號 2nd showbase hex前...
標準輸入輸出
linux的大部分命令都具有標準的輸入輸出埠,有哪些標準裝置資訊?名稱 檔案描述符 含義裝置 說明stdin 0標準輸入 鍵盤命令在執行時所需要的輸入資料,通過它來獲取 stdout 1標準輸出 顯示器命令在執行後所產生的輸出資料,通過它來送出 stderr 2標準錯誤 顯示器命令在執行後所產生的錯...
標準輸入輸出
目錄流緩衝 格式輸出 格式輸入 目錄流緩衝 格式輸出 格式輸入 記錄下,了解概念。當用流或檔案描述字i o函式開啟乙個檔案時,分別返回乙個流或檔案描述字,後面就可以將這個流或檔案描述字作為引數交給相應讀寫函式來完成實際的讀寫操作。通過關閉檔案可以終止程式與檔案的連線。檔案描述字表示為int型別的物件...