簡體   English   中英

使用 scanf_s 讀取字符

[英]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 要求為cCsS [...] 類型的所有輸入參數指定緩沖區大小。

[1] https://msdn.microsoft.com/en-us/library/w40768et.aspx

scanf_s的文檔說:

在字符的情況下,單個字符可能讀作如下:

char c;
scanf_s("%c", &c, 1);

所以以下應該有效(請參閱此處的現場演示)

#include <stdio.h>
int main(void)
{
  char i;
  printf("Do you want to be X's or O's?\n");
  scanf_s("%c",&i,1);
  printf("You chose %c\n", i);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM