關於C語言中的scanf的一些說明

scanf

<cstdio>
int scanf ( const char * format, ... );
Read formatted data from stdin
Reads data from stdin and stores them according to the parameter format into the locations pointed by the additional arguments.

The additional arguments should point to already allocated objects of the type specified by their corresponding format specifier within the format string.

    scanf()函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。其調用格式爲:scanf("<格式化字符串>",<地址表>);scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。

    /////////////////轉載的一點///////////////////////////

其控制串由三類字符構成:

1、格式化說明符;

2、空白符;

3、非空白符;

(A)格式化說明符

格式字符           說明

%a                 讀入一個浮點值(僅C99有效) 

%A                 同上

%c                 讀入一個字符

%d                 讀入十進制整數

%i                 讀入十進制,八進制,十六進制整數

%o                 讀入八進制整數

%x                 讀入十六進制整數

%X                 同上

%c                 讀入一個字符

%s                 讀入一個字符串

%f                 讀入一個浮點數

%F                 同上

%e                 同上

%E                 同上

%g                 同上

%G                 同上

%p                 讀入一個指針

%u                 讀入一個無符號十進制整數

%n                 至此已讀入值的等價字符數

%[]                掃描字符集合

%%                 讀%符

附加格式說明字符表

修飾符                       說明

L/l 長度修飾符               輸入"長"數據

h 長度修飾符                 輸入"短"數據

W 整型常數                   指定輸入數據所佔寬度

* 星號                       空讀一個數據 

hh,ll同上h,l但僅對C99有效。

(B)空白字符

空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符,空白符可以是space,tab,newline等等,直到第一個非空白符出現爲止。

(C) 非空白字符

一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。

////////////////////////////////////////////////////////////////////
網上找到幾個小例子:

例1.

#include "stdio.h" 

int main(void) 

    int a,b,c; 

   scanf("%d%d%d",&a,&b,&c);  

  printf("%d,%d,%d\n",a,b,c); 

  return 0;

}  

運行時按如下方式輸入三個值:

輸入:3□4□5

輸出:3,4,5 

   (1) &a、&b、&c中的&是地址運算符,分別獲得這三個變量的內存地址。

   (2) "%d%d%d"是按十進值格式輸入三個數值。輸入時,在兩個數據之間可以用一個或多個空格、tab鍵、回車鍵分隔。

      以下是合法輸入方式: 

      ① 3□□4□□□□5↙

      ② 3↙

         4□5↙

      ③ 3(tab鍵)4↙

         5↙

例2.

#include "stdio.h" 

int main(void) 

int a,b,c;

scanf("%d,%d,%d",&a,&b,&c);

printf("%d,%d,%d\n",a,b,c); 

  return 0;

}  

運行時按如下方式輸入三個值:

輸入:3,4,5

或者

3,□4,□5

3,□□□4,□5

......

都是合法的,但是","一定要跟在數字後面,如:

3□,4,□5 ↙就非法了,程序出錯。


scanf()的格式控制串可以使用其它非空白字符,但在輸入時必須輸入這些字符。

例:

scanf("%d,%d",&a,&b); 

輸入: 3,4 ↙(逗號與"%d,%d"中的逗號對應) 

scanf("a=%d,b=%d",&a,&b); 

輸入: a=3,b=4 ↙("a=","b=",逗號與"%d,%d"中的"a=","b="及逗號對應)


3、在用"%c"輸入時,空格和“轉義字符”均作爲有效字符。

例:

scanf("%c%c%c",&c1,&c2,&c3); 

輸入:a□b□c↙ 

結果:a→c1,□→c2,b→c3 (其餘被丟棄)


scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。

        ① 遇空格、“回車”、“跳格”鍵。

        ② 遇寬度結束。

        ③ 遇非法輸入。

在使用scanf時我們經常碰到一個鍵盤緩衝區殘餘的信息問題,比如說:

#include <stdio.h>
int main()
{
    int a;
    char c;
    do
    {
        scanf("%d",&a);
        scanf("%c",&c);
        printf("a=%d     c=%c\n",a,c);
    }while(c!='N');
}
這時候發現輸出時a是有具體數值的,然而scanf("%c", &c)是不能正常接收字符的,而且c的輸出是個換行,這是因爲,我們輸入完後敲擊了Enter換行,scanf把換行符讀入到了c中,爲此我們可以採取如下兩個措施來解決。
    措施1:採用fflush(stdin)函數,清除一個流,比如上例中在兩個scanf之間加入fflush(stdin),即可解決問題。
    措施2:採用getch()或者getchar()函數,比如上例中定義char ch,在兩個scanf之間加入ch = getchar();即可解決問題
    PS:網上還有這樣一個解決方法,用空格符來處理緩衝區殘餘信息:
運行出錯的程序:                                                                 使用了空格控制符後:
#include <stdio.h>                                                             #include <stdio.h>
int main()                                                                           int main()
{                                                                                       {
    int i;                                                                                     int i;
    char j;                                                                                  char j;
    for(i = 0;i < 10;i++)                                                               for(i = 0;i < 10;i++)
    {                                                                                          {
        scanf("%c",&j);/*這裏%前沒有空格*/                                          scanf(" %c",&j);/*注意這裏%前有個空格*/
    }                                                                                           }
}                                                                                          }

最後,我們再來說一下如何讓scanf接收有空格的字符串,例如"Hello world!"
#include <stdio.h>
int main()
{
    char str[80];
    
    scanf("%s",str);
    printf("%s",str);
    return 0;
}
輸入:Hello world!
輸出:Hello
這是因爲scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
        ① 遇空格、“回車”、“跳格”鍵。
        ② 遇寬度結束。
        ③ 遇非法輸入。
所以說在掃描到Hello後的空格時就結束了輸入,而world!留在了標準輸入流中,即stdin中。我們解決這個問題的方法是採用%[]這個格式控制符來使得scanf可以輸入帶有空格的字符串,即scanf("%[^\n]", str);

OK,關於scanf的一些說明就到此爲止~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章