c 中cin和scanf的區別是什麼?

時間 2021-05-08 09:58:12

1樓:

cin是iostream類的乙個物件,>>符號是過載,讀入的是「流」,再將流強制轉換成你所要的資料型別。具體可看c++primer中io類一章了解。

scanf是函式,c的遺產,不太了解。

不過函式和物件是很明顯兩個概念。

建議用cin和cout。

2樓:冒泡

具體實現的方法的問題,你輸入的整數在你的平台上已經超過unsigned int了,scanf這種情況下不會報錯,具體n的結果就沒定義,從你的結果看,你用的scanf應該是自然溢位,取了低32bit,而cin從測試結果看在溢位的時候用32bit全1標識錯誤,具體怎定義的沒去查標準,先保留觀點

你可以認為cin在這裡相當於:先用乙個假想的可以容納很大整數的型別輸入,然後判斷是否溢位,如果溢位則返回全1。當然實際上並不是這麼搞:)

最後說一下,你scanf用%ud應該是不對的,u和d分別對應unsigned int和int,u並不是乙個字首修飾,%u就行

3樓:

正如前面所說,scanf存在溢位後發生未定義行為的問題,是不安全的。

C語言正規場合最好不要用scanf,而是使用getchar和ungetc按位元組讀取,使用strtol、strtoul、strtod這些C89函式(以及strtoll、strtoull、strtof、strtold、strtoimax、strtoumax這些C99函式)進行轉換,它們對於溢位返回邊界值(浮點數返回inf)並且設定errno為ERANGE,和cin>>的行為差不多。

至於OJ這種非正規場合,用scanf就行了,別小題大做,沒人會在乎你的OJ程式是否安全。

ps. 不要以為按位元組讀取很慢,stdio是帶緩衝的,所以其實getchar是很快的。

ps2. 根據http://

cppreference.com

,atoi、atol、atoll、atof在標準語境下也是不安全的。

C 中解除cin和cout連線是否有必要tie兩次?

大明醬 關於std tie,可見 可以看到其定義 ostream tie const get ostream tie ostream tiestr set 可見其set引數為輸出流。那麼std cin tie nullptr 即為把cin 輸入流 和nullptr 空輸出流 繫結,即解除鏈結。而st...

linux中c庫函式和系統呼叫的區別是什麼呢?

徐聖 簡單的說c庫函式是為了方便使用者程式設計以及使用OS,對系統呼叫的封裝和擴充套件。封裝體現在使用系統功能介面更友好,更方便。直接調系統呼叫API,你會發現引數較多,各種返回異常需要自己處理。C庫一定程度上幫你做了這個工作。擴充套件體現在系統呼叫沒有的功能,c庫幫你擴充了。比如string庫很多...

c 和 t d n 的區別是什麼

井韶子 的調音部位國際語音學會官方並沒有給出,但是如果按照同部位擦音 類推的話,應為齦顎 舌面前。c 的調音部位可以認為與相同,但由於偏前偏後並沒有規定程度,因此調音部位允許有一些差異 只要比硬顎偏前就行2333 t 的主要調音部位只能是舌尖 舌尖 舌葉和齦 IPA中廣義的 t 的被動部位可以包括齒...