char c;
scanf("%s",&c);
這是正確還是錯誤?在stdin中輸入EOF
字符時究竟發生了什麼?是可以將字符轉換爲%s轉換說明
我知道這裏有類似的東西,但我找不到它?
我已經知道了確切的正確的形式這應該是:
scanf("%hhd",&c);
char c;
scanf("%s",&c);
這是正確還是錯誤?在stdin中輸入EOF
字符時究竟發生了什麼?是可以將字符轉換爲%s轉換說明
我知道這裏有類似的東西,但我找不到它?
我已經知道了確切的正確的形式這應該是:
scanf("%hhd",&c);
這是不對的。您不能在char
中放置字符串。這是未定義的行爲,並可能導致內存跺腳。
scanf("%c", &c);
是你如何把從scanf
採取char
。
更重要的是,避免scanf()
完全和使用getchar()
:
int c = getchar();
要知道返回類型。
不,這是不正確的。
儘管看起來發送地址到字符(&c
)可能是相同的,但它與「字符串」不同。
當然,C沒有真正的字符串類型;相反,我們在標準庫字符串和printf樣式函數中找到一個抽象,它使用字符指針的慣例指向字符串末尾具有空字節(空終止符)的一組字節。
如果您告訴scanf
要讀入"%s"
,然後提供char &
,則分配將只用於一個字節。即使輸入只有一個字節,它也會以空終止(在最後附加一個額外的字節),自動導致緩衝區溢出。
即使使用EOF,也不會有任何分配。 – Sabrina
我指的是在棧上爲本地變量'c'分配的單字節。我不是在談論'scanf'分配任何東西。 –
使用char c;scanf("%s",&c).
顯然是錯誤的。格式說明符"%s"
會讀入非空白字符序列,並在末尾附加'\0'
(參見cppreference concerning scanf)。所以它很可能會超過由單個字符char c
提供的內存(除非用戶只是按下了return或ctrl-d)。
改爲使用char c;scanf("%c",&c).
。
沒錯!閱讀文檔! 'scanf(「%c」,&c)' –
我已經通過google找到了這個https://linux.die.net/man/3/scanf –
你爲什麼要這麼做? –