2014-08-31 270 views
2

所以基本上我學習C,他們教我們使用gets()函數,我發現它被刪除,不能再使用。所以我試圖學習使用替代方法,gets_s()函數,但我似乎無法。例如試圖編譯:在下面的代碼給了我「未定義參考gets_s」未定義的引用gets_s

char line[21]; 
gets_s(line, 20); 
printf("The line entered was: %s\n", line); 

很多人說用fgets()代替gets()函數,但我不知道怎麼說將工作,因爲我想讀取用戶的輸入,而不是從文件中讀取。

+0

您需要包含一個標題,而不是定義'gets_s'。 – 2014-08-31 15:55:55

+1

'gets_s'僅在MSVC中可用。使用'fgets'。 – 2014-08-31 16:02:21

+1

更好的是,如果你的系統有它(比如最近的Posix規範),可以使用'getline'。它動態地爲線路分配緩衝區,因此可以接受非常大的線路(如果系統資源允許的話)。 – 2014-08-31 16:04:22

回答

4

函數gets_s不是一個一流的標準函數。它由Visual Studio(mentioned on MSDN)執行,如果包含stdio.h,則可以使用它。

有趣的是C11引入其作爲有些標準功能通過在附錄K提它,「邊界檢查接口」與其他_s功能一起。然而,許多編譯器選擇不實現這個接口,所以最好不要依賴它。

重申一下user3121023說,fgets可能是要走的最安全的方式(但如果你能,你應該使用sizeof):

fgets(line, sizeof line, stdin); 

注意你不需要通過比一個少數組大小爲

+0

如果您要將代碼從MSVC轉換爲標準化C,則可以在更新所有引用的同時使用'#DEFINE gets_s(x,len)fgets((x),(len)+ 1,stdin)''我建議反對它。一個簡單的'sed'命令會更好。 – 2014-08-31 17:04:07

+0

['get_s'](http://en.cppreference.com/w/c/io/gets)是C11標準的一部分。 – 2014-10-21 18:45:06