[英]Reading a character with scanf_s
我只是在擺弄 C 並遇到了這個小問題。 從我的輸出中可以看出,我得到了 '╠' 這個字符。
#include <stdio.h>
int main(void)
{
char c;
printf("Do you want to be X's or O's?\n");
scanf_s("%c", &c);
printf("You chose %c\n", c);
}
查看程序輸出
您正在濫用scanf_s()
。 Microsoft 編譯器可能會警告您使用他們的安全擴展(又名 c11 附件 k)。 但是,如果您這樣做,請小心。 scanf_s()
不是scanf()
的直接替代品。
在這種情況下,您必須將輸出緩沖區的大小作為額外參數傳遞。
char c;
scanf_s("%c", &c, 1);
必須將 1 作為單個字符的大小可能看起來有點迂腐。 那是因為%c
可以讀取任意數量的字符。 %c
只是%1c
(單個字符)的別名。
通過了解緩沖區大小scanf_s()
旨在防止緩沖區溢出(安全風險)。
盡管如此,這些功能究竟有多大幫助是有爭議的。 請參閱:附件 K 的現場經驗。
根據 msdn :
與 scanf 和 wscanf 不同,scanf_s 和 wscanf_s 要求為 c、C、s、S 類型的所有輸入參數或包含在 [] 中的字符串控制集指定緩沖區大小。 以字符為單位的緩沖區大小作為附加參數傳遞,緊跟在指向緩沖區或變量的指針之后。
…
在字符的情況下,單個字符可能讀作如下:
字符 c;
scanf_s("%c", &c, 1);
使用scanf_s
你必須提供一個長度 [1] :
char c;
scanf_s("%c", &c, 1);
在scanf_s
的情況下,將%c
視為%1c
的特殊快捷方式,這使這一點更加清晰。
MSDNAA 指出 [1]:
與 scanf 和 wscanf 不同, scanf_s 和 wscanf_s 要求為
c
、C
、s
、S
[...] 類型的所有輸入參數指定緩沖區大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.