格式化輸入函數scanf()及輸入輸出函數的*修飾符


1.scanf()輸入控制符

1.1 轉換說明符

轉換說明符       意        義
%c 把輸入解釋成一個字符
%d 把輸入解釋成一個有符號十進制整數
%e,%f,%g,%a 把輸入解釋成一個浮點數(%a 是C99標准)
%E,%F,%G,%A 把輸入解釋成一個浮點數(%A是C99標准)
%i 把輸入解釋成一個有符號十進制整數
%o 把輸入解釋成一個有符號八進制整數
%p 把輸入解釋成一個指針(一個地址)
%s

把輸入解釋成一個字符串:輸入的內容是以第一個非空白字符作為開始,

並且包含直到下一個空白字符的全部字符

%u 把輸入解釋成一個無符號十進制整數
%x,%X 把輸入解釋成一個有符號十六進制整數

1.2 轉換修飾符

修飾符   意     義
*

滯后賦值

示例:“%*d”

digit(s)

最大字段寬度:在達到最大字段寬度或者遇到第一個空白字符時(不管哪個先發生都一樣)

停止對輸入項的讀取

示例:"%10s"

hh

把整數讀作signed char 或者 unsigned char

示例:"%hhd” “%hhu”

ll

把整數讀作long long或者 unsigned long long (C99)

示例: "%lld” "%llu"

h,l或L

 "%hd"和"%hi" 指示該值將會存儲在一個short int 中。"%ho”、"%hx”和"%hu”指示該值將會存

儲在一個unsigned short int 中。"%ld” 和 "%li“ 指示該值將會存儲在一個 long 中。 "%lo"、"%lx"

和"%lu"指示該值將會存儲在一個 unsigned long 中。 "%le"、"%lf" 和 "%lg" 指示該值以double類型

存儲。將L(而非l)與e、f 和 g 一起指示該值以 long double 類型存儲。 如果沒有這些修飾符, d、 i、

o 和 x 指示 int 類型,而e、f 和 g 指示 float 類型

2.scanf()的返回值

  scanf()函數返回成功讀入的項目的個數。如果沒有讀取任何項目(如它期望一個數字但是出入了一個非數字字符),它會返回值0。當它檢測到“文件結尾”時,它返回EOF(EOF是文件stdio.h中定義的特殊值。一般,#define 指令把EOF 的值定義為 -1)。

3.用%c讀入空格與字符的問題

  如果在格式字符串中%c之前有一個空格,那么scanf()會跳到第一個非空白字符處。也就是說,命令scanf(“%c”,&ch)讀取在輸入中遇到的第一個字符,而scanf(“ %c”,&ch)(%c前有個空格)則讀取遇到的第一個非空白字符。

  對於同時輸入幾個字符,如果逗號(或任何非空格字符)和第一個%c之間沒有間隔,則輸入時,第一個字符與逗號之間也不能有間隔;如果有空格,則輸入時,第一個字符和逗號之間可以有任意多個字符,也可以是0個。如果逗號和第二個%c之間沒有間隔,則逗號和第二個輸入字符間也不能有間隔。如果有空格,則輸入時,第二個字符和逗號之間可以有任意多個字符,也可以是0個。

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     char ch1, ch2;
 6     int i;
 7     
 8     scanf("%c,%c", &ch1, &ch2);
 9     printf("%c,%c\n", ch1, ch2);
10 
11     scanf(" %c , %c", &ch1, &ch2);
12     printf("%c,%c\n", ch1, ch2);
13     
14     scanf(" %d", &i);
15     printf("i = %d\n", i);
16 
17     return 0;
18 }

  在Vc++6.0中的輸出結果為:

4.printf()函數的*修飾符

  假定不想事先制定字段寬度,而是希望由程序來指定該值,可以在字段寬度部分使用*來代替數字來達到目的,但是也必須使用一個參數來告訴函數字段寬度應該是什么。也就是說,如果轉換說明符是%*d ,那么參數列表中應該包括一個 * 值和一個 d 的值。同時這種方式也可以和浮點數一起使用來指定精度和字段寬度。

 1 #include <stdio.h>
 2 
 3 int main(void)
 4 {
 5     unsigned int width, precision;
 6     int num = 256;
 7     double weight = 123.45;
 8 
 9     printf("What field width?\n");
10     scanf("%d", &width);
11     printf("The number is: %*d:\n", width, num);
12     printf("Enter a width and a precision:\n");
13     scanf("%d %d", &width, &precision);
14     printf("Weight = %*.*f\n", width, precision, weight);
15 
16     return 0;
17 }

  在Vc++6.0中的輸出結果為:

  在這里,第一個問題的答案是8,所以8就是所用的字段寬度。與之類似,第二個輸入指示字段寬度為6,小數點右邊有3位數字。

5.scanf()函數的*修飾符

  在scanf()函數中,當把 * 放在 % 和說明符字母之間時,它使函數跳過相應的輸入項目。

6.scanf()函數應對非法輸入的處理

 1 #include <stdio.h>
 2  
 3 int main(void)
 4 {
 5      int i, j;
 6      char ch;
 7  
 8      scanf("%d", &i);
 9      printf("i = %d\n", i);
10  
11      while ( (ch=getchar()) != '\n')  
12         continue;
13  
14      scanf("%d", &j);
15      printf("j = %d\n", j);
16  
17      return 0;
18 }
19 /*
20     通過while循環把上面 i 輸入后的多的垃圾字符跳過
21     如果沒有while循環,在調試時輸入 i = 123asdfg
22     在Vc++6.0中的輸出結果為:
23             123asdfg
24             i = 123
25             j = -858993460
26 */

    在Vc++6.0中的輸出結果為:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM