上面結果中的地址值在不同計算機上可能不同。
例1.中第一條語句#include的含義是調用另一個文件stdio.h, 這
是一個頭文件, 其中包括全部標準輸入輸出庫函數(shù)的數(shù)據(jù)類型定義和函數(shù)說明。
Turbo C2.0對每個庫函數(shù)便用的變量及函數(shù)類型都已作了定義與說明, 放在相應
頭文件"*.h"中, 用戶用到這些函數(shù)時必須要用#include<*.h>或#include"*. h"
語句調用相應的頭文件, 以供連接。若沒有用此語句說明, 則連接時將會出現(xiàn)錯
誤。
二、scanf()函數(shù)
scanf()函數(shù)是格式化輸入函數(shù), 它從標準輸入設備(鍵盤) 讀取輸入的信息。
其調用格式為:
scanf("<格式化字符串>", <地址表>);
格式化字符串包括以下三類不同的字符;
1. 格式化說明符: 格式化說明符與printf()函數(shù)中的格式說明符基本相同。
2. 空白字符: 空白字符會使scanf()函數(shù)在讀操作中略去輸入中的一個或多
個空白字符。
3. 非空白字符: 一個非空白字符會使scanf()函數(shù)在讀入時剔除掉與這個非
空白字符相同的字符。
地址表是需要讀入的所有變量的地址, 而不是變量本身。這與printf()函數(shù)
完全不同, 要特別注意。各個變量的地址之間同","分開。
例2:
main()
{
int i, j;
printf("i, j=? ");
scanf("%d, %d", &i, &j);
}
上例中的scanf()函數(shù)先讀一個整型數(shù), 然后把接著輸入的逗號剔除掉, 最
后讀入另一個整型數(shù)。如果","這一特定字符沒有找到, scanf()函數(shù)就終止。若
參數(shù)之間的分隔符為空格, 則參數(shù)之間必須輸入一個或多個空格。
說明:
(1). 對于字符串數(shù)組或字符串指針變量, 由于數(shù)組名和指針變量名本身就
是地址, 因此使用scanf()函數(shù)時, 不需要在它們前面加上"&"操作符。
例3
mian()
{
char *p, str[20];
scanf("%s", p); /*從健盤輸入字符串*/
scanf("%s", str);
printf("%s ", p); /*向屏幕輸出字符串*/
printf("%s ", str);
}
(2). 可以在格式化字符串中的"%"各格式化規(guī)定符之間加入一個整數(shù), 表示
任何讀操作中的位數(shù)。
如例3中若規(guī)定只能輸入10字符給字符串指針p, 則第一條scanf() 函數(shù)語句
變?yōu)?BR> scanf("s", p);
程序運行時一旦輸入字符個數(shù)大于10, p就不再繼續(xù)讀入, 而后面的一個讀
入函數(shù)即scanf("%s", str)就會從第11個字符開始讀入。
實際使用scanf()函數(shù)時存在一個問題, 下面舉例進行說明:
當使用多個scanf()函數(shù)連續(xù)給多個字符變量輸入時, 例如:
main()
{
char c1, c2;
scanf("%c", &c1);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c21, c2);
}
運行該程序, 輸入一個字符A后回車 (要完成輸入必須回車), 在執(zhí)行scanf
("%c", &c1)時, 給變量c1賦值"A", 但回車符仍然留在緩沖區(qū)內, 執(zhí)行輸入語句
scanf("%c", &c2)時, 變量c2輸出的是一空行, 如果輸入AB后回車, 那么輸出結
果為: c1 is A, c2 is B。
要解決以上問題, 可以在輸入函數(shù)前加入清除函數(shù)fflush()( 這個函數(shù)的使
用方法將在本節(jié)最后講述)。修改以上程序變成:
#include
main()
{
char c1, c2;
scanf("%c", &c1);
fflush(stdin);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c1, c2);
}
例1.中第一條語句#include的含義是調用另一個文件stdio.h, 這
是一個頭文件, 其中包括全部標準輸入輸出庫函數(shù)的數(shù)據(jù)類型定義和函數(shù)說明。
Turbo C2.0對每個庫函數(shù)便用的變量及函數(shù)類型都已作了定義與說明, 放在相應
頭文件"*.h"中, 用戶用到這些函數(shù)時必須要用#include<*.h>或#include"*. h"
語句調用相應的頭文件, 以供連接。若沒有用此語句說明, 則連接時將會出現(xiàn)錯
誤。
二、scanf()函數(shù)
scanf()函數(shù)是格式化輸入函數(shù), 它從標準輸入設備(鍵盤) 讀取輸入的信息。
其調用格式為:
scanf("<格式化字符串>", <地址表>);
格式化字符串包括以下三類不同的字符;
1. 格式化說明符: 格式化說明符與printf()函數(shù)中的格式說明符基本相同。
2. 空白字符: 空白字符會使scanf()函數(shù)在讀操作中略去輸入中的一個或多
個空白字符。
3. 非空白字符: 一個非空白字符會使scanf()函數(shù)在讀入時剔除掉與這個非
空白字符相同的字符。
地址表是需要讀入的所有變量的地址, 而不是變量本身。這與printf()函數(shù)
完全不同, 要特別注意。各個變量的地址之間同","分開。
例2:
main()
{
int i, j;
printf("i, j=? ");
scanf("%d, %d", &i, &j);
}
上例中的scanf()函數(shù)先讀一個整型數(shù), 然后把接著輸入的逗號剔除掉, 最
后讀入另一個整型數(shù)。如果","這一特定字符沒有找到, scanf()函數(shù)就終止。若
參數(shù)之間的分隔符為空格, 則參數(shù)之間必須輸入一個或多個空格。
說明:
(1). 對于字符串數(shù)組或字符串指針變量, 由于數(shù)組名和指針變量名本身就
是地址, 因此使用scanf()函數(shù)時, 不需要在它們前面加上"&"操作符。
例3
mian()
{
char *p, str[20];
scanf("%s", p); /*從健盤輸入字符串*/
scanf("%s", str);
printf("%s ", p); /*向屏幕輸出字符串*/
printf("%s ", str);
}
(2). 可以在格式化字符串中的"%"各格式化規(guī)定符之間加入一個整數(shù), 表示
任何讀操作中的位數(shù)。
如例3中若規(guī)定只能輸入10字符給字符串指針p, 則第一條scanf() 函數(shù)語句
變?yōu)?BR> scanf("s", p);
程序運行時一旦輸入字符個數(shù)大于10, p就不再繼續(xù)讀入, 而后面的一個讀
入函數(shù)即scanf("%s", str)就會從第11個字符開始讀入。
實際使用scanf()函數(shù)時存在一個問題, 下面舉例進行說明:
當使用多個scanf()函數(shù)連續(xù)給多個字符變量輸入時, 例如:
main()
{
char c1, c2;
scanf("%c", &c1);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c21, c2);
}
運行該程序, 輸入一個字符A后回車 (要完成輸入必須回車), 在執(zhí)行scanf
("%c", &c1)時, 給變量c1賦值"A", 但回車符仍然留在緩沖區(qū)內, 執(zhí)行輸入語句
scanf("%c", &c2)時, 變量c2輸出的是一空行, 如果輸入AB后回車, 那么輸出結
果為: c1 is A, c2 is B。
要解決以上問題, 可以在輸入函數(shù)前加入清除函數(shù)fflush()( 這個函數(shù)的使
用方法將在本節(jié)最后講述)。修改以上程序變成:
#include
main()
{
char c1, c2;
scanf("%c", &c1);
fflush(stdin);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c1, c2);
}

