天天看點

格式字元串

格式字元串的一般形式為:    

%[*][輸入資料寬度][長度]類型

​其中有方括号[]的項為任選項。各項的意義如下。

​1) 類型表示輸入資料的類型,其格式符和意義如下表所示。

格式

字元意義:

d  輸入十進制整數

o  輸入八進制整數

x  輸入十六進制整數

u  輸入無符号十進制整數

f或e   輸入實型數(用小數形式或指數形式)

c  輸入單個字元

s  輸入字元串

2) “*”符用以表示該輸入項,讀入後不賦予相應的變量,即跳過該輸入值。如:

  1. scanf("%d %*d %d",&a,&b);

當輸入為:1   2   3時,把1賦予a,2被跳過,3賦予b。

3) 寬度

用十進制整數指定輸入的寬度(即字元數)。例如:

  1. scanf("]",&a);  輸入12345678隻把12345賦予變量a,其餘部分被截去。
  2. 又如:
  1. scanf("MM", &a, &b);  輸入12345678将把1234賦予a,而把5678賦予b。

4) 長度

長度格式符為l和h,l表示輸入長整型資料(如%ld)和雙精度浮點數(如%lf)。h表示輸入短整型資料。

使用scanf函數還必須注意以下幾點:

  1. scanf函數中沒有精度控制,如:scanf("%5.2f",&a);是非法的。不能企圖用此語句輸入小數為2位的實數。
  • scanf中要求給出變量位址,如給出變量名則會出錯。如 scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。
  • 在輸入多個數值資料時,若格式控制串中沒有非格式字元作輸入資料之間的間隔則可用空格,TAB或回車作間隔。C編譯在碰到空格,TAB,回車或非法資料(如對“%d”輸入“12A”時,A即為非法資料)時即認為該資料結束。
  • 在輸入字元資料時,若格式控制串中無非格式字元,則認為所有輸入的字元均為有效字元。

例如:

  1. scanf("%c%c%c", &a, &b, &c);  輸入 d、e、f 則把'd'賦予a,' ' 賦予b,'e'賦予c。隻有當輸入為 def 時,才能把'd'賦于a,'e'賦予b,'f'賦予c。

如果在格式控制中加入空格作為間隔,如:

  1. scanf

("%c %c %c",&a,&b,&c);則輸入時各資料之間可加空格。

【例1】

  1. #include 
  • int main(void)
  • ​{
  •     char a,b;
  •     printf("input character a,b\n");
  •     scanf("%c%c", &a, &b);
  •     printf("%c%c\n",a,b);
  •     return 0;
  • }

由于scanf函數"%c%c"中沒有空格,輸入M  N,結果輸出隻有M。而輸入改為MN時則可輸出MN兩字元。

【例2】

  1. #include 
  • int main(void)
  • ​{
  •     char a,b;
  •     printf("input character a,b\n");
  •     scanf("%c %c",&a,&b);
  •     printf("\n%c%c\n",a,b);
  •     return 0;
  • }

本例表示scanf格式控制串"%c %c"之間有空格時,輸入的資料之間可以有空格間隔。

5) 如果格式控制串中有非格式字元則輸入時也要輸入該非格式字元。

例如:

  1. scanf("%d,%d,%d",&a,&b,&c);
  2. ​其中用非格式符“ , ”作間隔符,故輸入時應為:5,6,7。又如:
  1. scanf("a=%d,b=%d,c=%d",&a,&b,&c);
  2. ​則輸入應為:a=5,b=6,c=7。

6) 如輸入的資料與輸出的類型不一緻時,雖然編譯能夠通過,但結果将不正确。

【例3】

  1. #include 
  • int main(void)
  • ​{
  •     int a;
  •     printf("input a number\n");
  •     scanf("%d",&a);
  •     printf("%ld",a);
  •     return 0;
  • }

由于輸入資料類型為整型,而輸出語句的格式串中說明為長整型,是以輸出結果和輸入資料不符。如改動程式如下(【例4-11】):

  1. #include 
  • int main(void)
  • ​{
  •     long a;
  •     printf("input a long integer\n");
  •     scanf("%ld", &a);
  •     printf("%ld",a);
  •     return 0;
  • }

運作結果為:

input a long integer

1234567890

1234567890

當輸入資料改為長整型後,輸入輸出資料相等。

【例4】

  1. #include 
  • int main(void)
  • ​{
  •     char a,b,c;
  •     printf("input character a,b,c\n");
  •     scanf("%c %c %c",&a,&b,&c);
  •     printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
  •     return 0;
  • }

輸入三個小寫字母,輸出其ASCII碼和對應的大寫字母。

【例5】

  1. #include 
  • int main(void)
  • ​{
  •     int a;
  •     long b;
  •     float f;
  •     double d;
  •     char c;
  •     printf("\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",
  •     ​sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
  •     return 0;
  • }

輸出各種資料類型的位元組長度。