在比較早的C/C++版本中,經常可以看到推薦使用gets函數來進行整行字符串的輸入,就像下面這樣的簡單寫法即可輸入一整行:
C++
gets(str);
但是當輸入的字符串長度超過數組長度上限MAX_LEN時,gets函數會把超出的部分也一并讀進來,并且會覆蓋數組之外的內存空間,這就導致了一定的安全風險,因此C++11標準將gets函數廢棄了,然后在C++14時將該函數移除,如果現在想要整行輸入的話,推薦使用cin.getline函數(見下文)。
下面對三種整行輸入方法進行解釋。
cin.getline:
僅C++可用,C語言不可用。需要添加#include 頭文件,并且在頭文件后增加一行using namespace std;。然后我們可以像下面這樣使用,其中第一個參數是字符數組,第二個參數是最大允許讀入的字符個數,設置為字符數組的長度即可。
C++
cin.getline(str, MAX_LEN);
scanf("%[^\n]", str)
:C++和C語言均可用。原理是使用scanf的正則表達式輸入功能,其中%[^\n]的含義是 “只要不為\n,就一直讀入”,也就是說它會讀入到換行符結束(或者全部讀完),即實現了讀入整行的效果。關于正則表達式的內容留給有興趣的同學了解,這里就不展開了。需要注意,這種方式不會把碰到的換行符處理掉,導致連續輸入多行字符串的時候還要自己動手處理換行符,并不是很方便(可以參考 字符串輸入輸出II),因此一般不推薦使用這種寫法。
fgets:
C++和C語言均可用。用法如下所示,其中第一個參數是字符數組,第二個參數是最大允許讀入的字符個數,設置為字符數組的長度即可,第三個參數是文件指針,對做算法題來說設置為stdin即可,表示標準輸入流。
C++
fgets(str, MAX_LEN, stdin);
但是fgets函數有個特點,就是它會把我們輸入的換行符也讀到字符數組里,這就給我們做算法題帶來一些麻煩(特別是要讀入多行字符串的情況,因為基本上的題都是不需要在字符數組的末尾加這個換行的),因此在使用fgets函數輸入后需要做額外處理,即把\n替換為\0,如下所示:
C++
fgets(str, MAX_LEN, stdin);
str[strcspn(str, "\n")] = '\0';
其中strcspn函數需要引入string.h頭文件,含義是在一個數組中尋找某個或某些字符(例如"abc"表示尋找字符’a’或字符’b’或字符’c’,"\n"表示尋找換行符),并返回第一個滿足的下標。注意不能用str[strlen(str) - 1] = '\0’的方式來實現,因為如果是讀入最后一行的話可能不是以\n結尾,這時候字符數組末尾不會有多余的\n。