輸入和輸出含有空格的字符串的方法

一、gets()和puts()進化版fgets()和fputs()

總結一下就是:

gets函數沒有限制讀入的個數,這很可能會導致程序向未知的內存空間寫入數據,而導致程序出錯。

fgets函數中第二個參數限制了讀取的個數,這也解決了gets函數存在的問題,但要注意fgets函數只會讀取n-1個字符(如果遇到換行符會更少),並在最後添加字符串結束標誌,而且,fgets也會將換行符讀入。

https://www.cnblogs.com/qingergege/p/5925811.html

gets()函數不讀取換行符'\n',它會吧換行符替換成空字符'\0',作爲c語言字符串結束的標誌。

gets()函數經常和puts()函數配對使用,puts()函數用於顯示字符串,並自動在字符串後面添加一個換行標誌'\n'

gets()函數存在一個嚴重的缺陷,這個缺陷就是:它不會檢查數組是否能夠裝的下輸入行:

c只分配了3個字節的空間,填滿這三個空間後,gets()函數就會訪問未被分配的內存空間,如果這片空間已經存有數據,這時程序就會發生錯誤,而中斷。正是由於gets()函數的這個缺陷,在C99標準中,已經不再建議使用gets()函數,而在C11中更是直接拋棄了這個函數。

char *fgets(char *buf, int bufsize, FILE *stream);

注意一下第二個參數bufsize,這個參數就限制了讀取的字符的個數,這就可以解決gets()函數的缺陷。我們知道fgets() 函數主要用於讀取文件,如果要讀取鍵盤,則stream參數應該爲stdin

需要注意的是,如果bufsize設置爲n,那麼fgets()函數最多讀取n-1個字符,之所以用“最多”這個詞是因爲,如果在之前遇到了換行符,fgets函數也會返回

還有一點就是,fgets()函數會讀取換行符(這一點和gets函數不同),當讀取結束後,fgets函數會爲buf在末尾添加一個空字符作爲字符串的結束。


二、getline

getline(cin,s6); 讀取字符到遇到換行,空格可讀入,‘\n’直到結束。

string基本知識點介紹:https://blog.csdn.net/fighting123678/article/details/80471906

string和char*對比:https://blog.csdn.net/fighting123678/article/details/80383572


三、使用scanf

1、scanf("%[^\n]",a);遇到換行符停止讀入;

2、scanf("%[^\n]%*c",a);這樣寫的話,*c可以忽略掉回車符

這樣就可以輸入3組數據 

這樣只能輸入1組數據,因爲後面的都被換行擋住了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章