回覆列表
  • 1 # 錢布斯

    1、使用區別

    scanf()不會檢查輸入邊界,可能造成資料溢位。

    scanf_s()會進行邊界檢查。

    2、意思

    scanf表示從鍵盤輸入指定格式的資料。如:scanf("%d",x);指從鍵盤給x輸入一個int型(整型)資料;scanf("%f",x);指從鍵盤給x輸入一個float型(實型)資料;對應的輸出為:printf 按照指定的格式輸出資料;如printf("%d",x); 指按整型資料輸出X中的值。

    因為帶“_s”字尾的函式是為了讓原版函式更安全,傳入一個和引數有關的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統。

    3、scanf_s()引數與scanf()不同

    例如scanf(“%s”,&name,n),整形n為name型別的大小,如果name是陣列,那n就是該陣列的大小。

    因為回車也是字元

    scanf_s("%d%c", &i );

    這句後面加個

    getchar();

    而且你這明明是兩個說明符,怎麼賦給一個變數,用%*c接收一個字元(但不賦值)

    最後scanf_s和scanf的用法不同,需要三個引數,最後一個是要讀入的位元組數(用sizeof確定)

    建議將程式中的所有scanf_s替換為scanf

    然後在程式碼第一行前面加

    #define _CRT_SECURE_NO_WARNINGS

    遮蔽警告

    scanf_s("%s",names[count],20);

    ================================

    格式控制符:

    %---格式說明引導符。

    ----指定左對齊輸出。

    0---指定空位填零。

    m.n --- 指定輸出域寬度及精度。

    l.h---輸出長度的修正。

    格式字元:

    %i---輸出一個整型數;

    %d---輸出一個整型數;

    %f---輸出一個浮點數;

    %e---輸出一個浮點數,科學計數法;

    %g---輸出一個浮點數,當指數小於-4或者大於5,則運用科學計數法,否則正常顯示浮點數;

    %c---輸出一個字元;

    %o---輸出一個八進位制的整型數,前面不帶0;

    %#o---輸出一個八進位制的整型數,前面帶0;

    %x---輸出一個十六進位制的整型數,前面不帶0x;

    %#x---輸出一個十六進位制的整型數,前面帶0x, 如果x大寫,則顯示的時候也是大寫。

    %u---不帶符號的十進位制整數。

    %%---輸出一個%.

    跳脫字元:

    \a:蜂鳴,響鈴

    \b:回退:向後退一格

    \f:換頁

    :換行,游標到下行行首

    :回車,游標到本行行首

    \t:水平製表

    \v:垂直製表

    \\:反斜槓

    \":單引號

    \":雙引號

    \?:問號

    \ddd:三位八進位制

    \xhh:二位十六進位制

    \0:空字元(NULL),什麼都不做

    printf的格式控制的完整格式:

    % - 0 m.n l或h 格式字元

    下面對組成格式說明的各項加以說明:

    ①%:表示格式說明的起始符號,不可缺少。

    ②-:有-表示左對齊輸出,如省略表示右對齊輸出。

    ④m.n:m指域寬,即對應的輸出項在輸出裝置上所佔的字元數。N指精度。用於說明輸出的實型數的小數位數。為指定n時,隱含的精度為n=6位。

    ⑤l或h:l對整型指long型,對實型指double型。h用於將整型的格式字元修正為short型。

  • 中秋節和大豐收的關聯?
  • 新年好,詩歌?