字串(character string)是乙個或多個字元的序列。如下所示:
"zing went the strings of my heart!"
雙引號不是字串的一部分。雙引號告知編譯器它括起來的是字串。c語言沒有專門用於儲存字串的變數型別,字串都被儲存在char型別的陣列中。字串常量"x"
和字元常量'x'
不同,區別之一在於'x'
是基本型別(char),而"x"
是派生型別(char陣列);區別之二是"x"
實際上由兩個字串組成:'x'
和空字元\0
。
在c語言中讀取字串有多種方法,比如scanf() 配合%s使用,但是這種方法只能獲取乙個單詞,即遇到空格等空字元就會返回。如果要讀取一行字串,比如:
i love you!
這種情況,scanf()就無能為力了。這時我們最先想到的是用gets()讀取.
gets()函式從標準輸入(鍵盤)讀入一行資料,所謂讀取一行,就是遇到換行符就返回。gets()函式並不讀取換行符'\n'
,它會把換行符替換成空字元'\0'
,作為c語言字串結束的標誌。
gets()函式經常和puts()函式配對使用,puts()函式用於顯示字串,並自動在字串後面新增乙個換行標誌'\n'
。
gets()函式存在乙個嚴重的缺陷,這個缺陷就是:它不會檢查陣列是否能夠裝得下輸入行。
示例分析:
/* getsputs.c -- using gets() and puts() */
#include
#define stlen 81
intmain
(void
)
下面是某些編譯器(至少是舊式編譯器)中的執行示例:
enter a string, please.
i want to learn about string theory![使用者輸入]
your string twice:
i want to learn about string theory!
i want to learn about string theory!
done.
下面是在另乙個編譯器中的輸出示例:
enter a string, please.
warning:this program uses gets(),which is unsafe.
i want to learn about string theory![使用者輸入]
your string twice:
i want to learn about string theory!
i want to learn about string theory!
done.
編譯器在輸出中插入了一行警告資訊。這是怎麼回事?問題出在gets()唯一的引數是words,它無法檢查是否裝得下輸入行。陣列名會轉換成該陣列首元素的位址,因此gets()函式只知道陣列的開始處,並不知道陣列中有多少個元素。
如果輸入的字串過長,會導致緩衝區溢位(buffer overflow),即多餘的字元超出了指定的目標空間。gets()函式就會訪問未被分配的記憶體空間,如果這些記憶體未被使用,不會立即出現問題;如果這片空間已經存有資料,就會擦除掉程式中的其他資料,會導致程式中止。
正式由於gets()函式的這個缺陷,在c99標準中,已經不再建議使用gets()函式,而在c11中更是直接拋棄了這個函式。然而在實際應用中,編譯器為了相容以前的**,大部分都繼續支援gets()函式。
gets()被拋棄,那我們用什麼來代替它的功能呢?
c11標準新增了gets_s()函式可以代替gets()函式,但是,該函式是stdio.h輸入輸出函式系類中的可選擴充套件,因此,即使編譯器支援c11標準,也有可能不支援gets_s()函式。
其實我們可以用c語言中的fgets()函式來代替gets()
接下來的部落格會會繼續分析其他字串輸入函式。
C語言的字串輸入函式gets s
gets s 與fgets 的區別如下 第二個特性說明,只要輸入行未超過最大字元數,gets s 與gets 幾乎一樣,完全可以用gets s 替代gets 第3個特性,則需要我們進一步學習才能運用好。如果目標儲存區裝得下輸入行,gets fgets 和gets s 3個函式都內問題。但是fgets...
gets和scanf輸入字串的比較
scanf 函式和gets 函式都可用於輸入字串,但在功能上有區別。若想從鍵盤上輸入字串 hi hello 則應該使用 gets 函式。gets可以接收空格 而scanf遇到空格 回車和tab鍵都會認為輸入結束,所有它不能接收空格。char string 15 gets string 遇到回車認為輸...
字串輸入gets與scanf的區別
gets 和scanf 的區別 相同點 在讀入字串之後系統自動在字串後加上 0 不同點 gets 只能一次輸入乙個字串,可以讀入包含空格和tab的全部字元,直到遇到回車為止,而scanf 遇到 tab 空格等字元就會停止輸入。關於eof scanf d n eof 相當於 scanf d n eof...