2017-02-12 41 views
-1
char c; 
scanf("%s",&c); 

這是正確還是錯誤?在stdin中輸入EOF字符時究竟發生了什麼?是可以將字符轉換爲%s轉換說明

我知道這裏有類似的東西,但我找不到它?


我已經知道了確切的正確的形式這應該是:

scanf("%hhd",&c); 
+2

沒錯!閱讀文檔! 'scanf(「%c」,&c)' –

+0

我已經通過google找到了這個https://linux.die.net/man/3/scanf –

+0

你爲什麼要這麼做? –

回答

0

這是不對的。您不能在char中放置字符串。這是未定義的行爲,並可能導致內存跺腳。

scanf("%c", &c); 

是你如何把從scanf採取char

更重要的是,避免scanf()完全和使用getchar()

int c = getchar(); 

要知道返回類型。

2

不,這是不正確的。

儘管看起來發送地址到字符(&c)可能是相同的,但它與「字符串」不同。

當然,C沒有真正的字符串類型;相反,我們在標準庫字符串和printf樣式函數中找到一個抽象,它使用字符指針的慣例指向字符串末尾具有空字節(空終止符)的一組字節。

如果您告訴scanf要讀入"%s",然後提供char &,則分配將只用於一個字節。即使輸入只有一個字節,它也會以空終止(在最後附加一個額外的字節),自動導致緩衝區溢出。

+0

即使使用EOF,也不會有任何分配。 – Sabrina

+0

我指的是在棧上爲本地變量'c'分配的單字節。我不是在談論'scanf'分配任何東西。 –

0

使用char c;scanf("%s",&c).顯然是錯誤的。格式說明符"%s"會讀入非空白字符序列,並在末尾附加'\0'(參見cppreference concerning scanf)。所以它很可能會超過由單個字符char c提供的內存(除非用戶只是按下了return或ctrl-d)。

改爲使用char c;scanf("%c",&c).