格式化字符串(轉載)

scanf() 函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤)讀取輸入的信息。
        可讀入任何固有類型的數據並自動把數值變換成適當的機內格式。
        scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
        其控制串由三類字符構成:1。格式化說明符;2。空白符;3。非空白符;

其調用格式爲:   scanf("<格式化字符串>",<地址表>);
格式化字符串包括以下三類不同的字符;
(1)格式化說明符:
格式化說明符與printf()函數中的格式說明符基本相同。但和printf()函數中格式字符串的用法有一些小區別。
格式字符           說明
%a                 讀入一個浮點值(僅C99有效)
%A                 同上
%c                 讀入一個字符
%d                 讀入十進制整數
%i                 讀入十進制,八進制,十六進制整數
%o                 讀入八進制整數
%x                 讀入十六進制整數
%X                 同上
%c                 讀入一個字符
%s                 讀入一個字符串
%f                 讀入一個浮點數
%F                 同上
%e                 同上
%E                 同上
%g                 同上
%G                 同上
%p                 讀入一個指針
%u                 讀入一個無符號十進制整數
%n                 至此已讀入值的等價字符數
%[]                掃描字符集合
%%                 讀%符號

(2)附加格式說明字符表:
格式化字符串的一般形式爲:[賦值抑制標記][字段寬度][精度]類型說明符其中方括號[]中的項爲可選項。
賦值抑制標記*:該字符命令scanf按當前的轉換說明符進行轉換,但忽略轉換後的結果,即不將它賦給任何變量。
字段寬度:用於指定輸入字段的寬度,如果沒有指定,則以空白作爲結束標記。
精度:是一個字符,可以是h、l、L,用於改變它後面的類型說明符的含義。
L/l 長度修飾符 輸入"長"數據。
h   長度修飾符 輸入"短"數據。
h: 用於d、i、o、u、x、X、n前,指定參數是指向short int或unsigned short int的指針。
l: 用於d、i、o、u、x、X、n前,指定參數是指向long或unsigned long的指針。
    用於a、A、e、E、f、F、g、G前,指定參數是指向double的指針。
L: 用於a、A、e、E、f、F、g、G前,指定參數是指向long double的指針。
hh:用於d、i、o、u、x、X、n前,指定參數是指向signed char或unsigned char的指針。
ll:用於d、i、o、u、x、X、n前,指定參數是指向long long或unsigned long long的指針。

(3)空白字符: 空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。例如:
#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 ↙(輸入a,b,c的值)
printf輸出的a,b,c的值爲   3,4,5
&a、&b、&c中的&是地址運算符,分別獲得這三個變量的內存地址。
"%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 ↙(輸入a,b,c的值)
或者
3,□4,□5 ↙(輸入a,b,c的值)
3,□□□4,□5 ↙(輸入a,b,c的值)
......
都是合法的,但是","一定要跟在數字後面,如:
3□,4,□5 ↙就非法了,程序出錯。

(4) 非空白字符: 一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。例如:
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="及逗號對應)。
(5) 在用"%c"輸入時,若格式控制串中無非格式字符,則認爲所有輸入的字符均爲有效字符。
例如:
scanf("%c%c%c",&c1,&c2,&c3);
輸入:a□b□c↙
結果:a→c1,□→c2,b→c3 (其餘被丟棄) 。

(6) scanf()遇以下情況將結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
        ① 遇空格、“回車”、“跳格”鍵。
        ② 遇寬度結束。
        ③ 遇非法輸入。

(7)地址表是需要讀入的變量的地址,而不是變量本身。各個變量的地址之間同","分開。
例如:
#include
void main()
{
       int i, j;
       printf("i, j=?/n");
       scanf("%d, %d", &i, &j);
}
例中的scanf()函數先讀一個整型數,然後把接着輸入的逗號剔除掉,最後讀入另一個整型數。如果","這一特定字符沒有找到,scanf()函數就終止。若參數之間的分隔符爲空格,則參數之間必須輸入一個或多個空格。

(8)對於字符串數組或字符串指針變量,由於數組名和指針變量名本身就是地址,因此使用scanf()時,不需要加上"&"操作符。
例如:
#include
void main()
{
       char *p, str[20];
          p = new char[20];
          scanf("%s", p);     /*從健盤輸入字符串*/
          scanf("%s", str);
          printf("%s/n", p); /*向屏幕輸出字符串*/
          printf("%s/n", str);
}
(9)可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。
如上例中若規定只能輸入10字符給字符串指針p,則第一條scanf() 函數語句變爲:scanf("%10s", p);
程序運行時一旦輸入字符個數大於10,p就不再繼續讀入,而scanf("%s", str)會從第11個字符開始讀入。
(10)scanf()函數中沒有精度控制。
如:scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數爲2位的實數。
(11)scanf中要求給出變量地址,如果給出變量名則會出錯
如 scanf("%d",a);是非法的,應改爲scnaf("%d",&a);纔是合法的。
(12)在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。
C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即爲非法數據)時即認爲該數據結束。

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