字串一文對字串做了個簡單介紹,若要讀取字串,則首先需要分配空間,最簡單的辦法就是宣告陣列,如下
char name[20]
;
c語言提供了許多字串輸入函式:scanf()
、gets()
和fgets()
等;輸出函式:printf()
、puts()
和fputs()
函式等。本文主要講解這部分內容。
另外,c++也提供了字串行輸入函式:getline()
和get()
,詳細可戳此鏈結檢視。
輸出scanf()一文中介紹了scanf()
函式,並可利用%s
轉換說明讀取字串。但是,該函式從第1個非空白字元作為字串的開始,以下乙個空白字元作為結束。因此,scanf()
讀取的字串中不會包含空格,讀取的更像是單詞。
gets()
函式用於讀取一整行輸入,直到遇到換行符,並丟棄換行符而保留其餘字元,並在最後新增乙個空字元使之成為字串。經常與puts()
函式(下文講述)成對使用。例如:
char name[20]
;gets
(name)
;puts
(name)
;
gets()
函式用於讀取整行資料(不包括末尾的換行符),puts()
函式用於輸出。
但是,gets()
函式有乙個問題。例如在上述**中,name
的大小為20,而輸入的時候大小可能會超出這個限制,造成緩衝區溢位,因此它是不安全的。c11標準中已經廢除了該函式,但為了相容以前的**,有些編譯器還是提供了支援。
因此,可使用fgets()
和gets_s()
函式替代gets()
函式。
fgets()
函式稍微要複雜一些,它通過第2個引數對輸入進行限制。假設第2個引數值為n
,則fgets()
函式將讀入前n-1
個字元,或者遇到第乙個換行符為止,但是,該換行符也會儲存在字串中,不會被丟棄(注意與gets()
函式的區別)。多餘的字元將會保留在緩衝區中,作為下一次的輸入。
fgets()
函式一般用來處理檔案輸入,因此需要第3個引數指定要讀入的檔案。如果是從鍵盤輸入,則第3個引數設定為stdin
,表示標準輸入。
fgets()
函式常與fputs()
函式(下文講述)配對使用,同樣需要給fputs()
函式設定引數stdout
,表示標準輸出,例如
char name[20]
;fgets
(name,20,
stdin);
fputs
(name,
stdout
);
fgets()
函式返回指向char
的指標,返回的位址與第乙個引數位址相同。如果該函式讀到檔案末尾,則會返回乙個空指標。
c11新增gets_s()
函式,該函式與fgets()
函式類似,用引數限制讀入的字元數。與fgets()
函式不同的是,gets_s()
函式只從標準輸入中讀取資料,因此不需要第3個引數,且讀取到換行符時會直接丟棄而不是儲存,gets_s()
函式與gets()
更像。
如果gets_s()
函式讀到最大字元數仍然沒有讀到換行符,則會把目標陣列中的首字元改為空字元,讀取並丟棄隨後的輸入,返回空指標,這就需要編寫特殊的處理函式。這種情況下,該函式沒有fgets()
函式方便。
綜上所述,用fgets()
函式從鍵盤輸入更合適。
printf()一文中介紹了printf()
函式,使用%s
轉換說明輸出字串,具體可參見此文。
在上文中已經使用了puts()
函式,把字串位址作為引數即可,在遇到空字串時則停止輸出。該函式顯示字串時會自動在末尾新增乙個換行符。
上文中也使用了fputs()
函式,該函式第2個引數指明要寫入的檔案,如果要列印在螢幕上,把第2個引數設定為stdout
即可,表示標準輸出。與puts()
函式不同的是,fputs()
函式不會在輸出末尾新增換行符,但可以保留輸入時字串中的換行符。
C語言輸入字元和字串
字元 對三個函式的總結 getchar getche getch 函式緩衝區 標頭檔案回顯 適用平台 getchar 有stdio.h 有windows linux mac os 等所有平台 getche 無conio.h 有windows getch 無conio.h 無windows 使用者按下...
C語言輸入字元和字串
c語言有多個函式可以從鍵盤獲得使用者輸入,它們分別是 scanf 和 printf 類似,scanf 可以輸入多種型別的資料。getchar getche getch 這三個函式都用於輸入單個字元。gets 獲取一行資料,並作為字串處理。scanf 是最靈活 最複雜 最常用的輸入函式,我們講解字元輸...
C語言 字串的輸入 輸出
c語言中沒有字串型別,而是用字元陣列 char a 代替 單字元 c 字串 s 法一 用scanf輸入字串,printf輸出字串 char ch 5 for int i 0 i 5 i for int i 0 i 5 i system pause return 0 法 二 整個字串處理 char c...