二、scanf()函數(shù)
scanf()函數(shù)是格式化輸入函數(shù), 它從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤) 讀取輸入的信息。
其調(diào)用格式為:
scanf("<格式化字符串>", <地址表>);
格式化字符串包括以下三類不同的字符;
1. 格式化說(shuō)明符: 格式化說(shuō)明符與printf()函數(shù)中的格式說(shuō)明符基本相同。
2. 空白字符: 空白字符會(huì)使scanf()函數(shù)在讀操作中略去輸入中的一個(gè)或多 個(gè)空白字符。
3. 非空白字符: 一個(gè)非空白字符會(huì)使scanf()函數(shù)在讀入時(shí)剔除掉與這個(gè)非空白字符相同的字符。
地址表是需要讀入的所有變量的地址, 而不是變量本身。這與printf()函數(shù)完全不同, 要特別注意。各個(gè)變量的地址之間同","分開。
例2:
main()
{
int i, j;
printf("i, j=?\n");
scanf("%d, %d", &i, &j);
}
上例中的scanf()函數(shù)先讀一個(gè)整型數(shù), 然后把接著輸入的逗號(hào)剔除掉, 最后讀入另一個(gè)整型數(shù)。如果","這一特定字符沒(méi)有找到, scanf()函數(shù)就終止。若參數(shù)之間的分隔符為空格, 則參數(shù)之間必須輸入一個(gè)或多個(gè)空格。
說(shuō)明:
(1). 對(duì)于字符串?dāng)?shù)組或字符串指針變量, 由于數(shù)組名和指針變量名本身就是地址, 因此使用scanf()函數(shù)時(shí), 不需要在它們前面加上"&"操作符。
例3
mian()
{
char *p, str[20];
scanf("%s", p); /*從健盤輸入字符串*/
scanf("%s", str);
printf("%s\n", p); /*向屏幕輸出字符串*/
printf("%s\n", str);
}
(2). 可以在格式化字符串中的"%"各格式化規(guī)定符之間加入一個(gè)整數(shù), 表示任何讀操作中的最大位數(shù)。
如例3中若規(guī)定只能輸入10字符給字符串指針p, 則第一條scanf() 函數(shù)語(yǔ)句變?yōu)?/P>
scanf("%10s", p);
程序運(yùn)行時(shí)一旦輸入字符個(gè)數(shù)大于10, p就不再繼續(xù)讀入, 而后面的一個(gè)讀入函數(shù)即scanf("%s", str)就會(huì)從第11個(gè)字符開始讀入。
實(shí)際使用scanf()函數(shù)時(shí)存在一個(gè)問(wèn)題, 下面舉例進(jìn)行說(shuō)明:
當(dāng)使用多個(gè)scanf()函數(shù)連續(xù)給多個(gè)字符變量輸入時(shí), 例如:
main()
{
char c1, c2;
scanf("%c", &c1);
scanf("%c", &c2);
printf("c1 is %c, c2 is %c", c2\1, c2);
}
運(yùn)行該程序, 輸入一個(gè)字符A后回車 (要完成輸入必須回車), 在執(zhí)行scanf ("%c", &c1)時(shí), 給變量c1賦值"A", 但回車符仍然留在緩沖區(qū)內(nèi), 執(zhí)行輸入語(yǔ)句 scanf("%c", &c2)時(shí), 變量c2輸出的是一空行, 如果輸入AB后回車, 那么輸出結(jié)果為: c1 is A, c2 is B。
要解決以上問(wèn)題, 可以在輸入函數(shù)前加入清除函數(shù)fflush()( 這個(gè)函數(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.1.2 非格式化輸入輸出函數(shù)
非格式化輸入輸出函數(shù)可以由上面講述的標(biāo)準(zhǔn)格式化輸入輸出函數(shù)代替, 但這些函數(shù)編譯后代碼少, 相對(duì)占用內(nèi)存也小, 從而提高了速度, 同時(shí)使用也比較方便。下面分別進(jìn)行介紹。
一、puts()和gets()函數(shù)
1. puts()函數(shù)
puts()函數(shù)用來(lái)向標(biāo)準(zhǔn)輸出設(shè)備(屏幕)寫字符串并換行, 其調(diào)用格式為:
puts(s);
其中s為字符串變量(字符串?dāng)?shù)組名或字符串指針)。
puts()函數(shù)的作用與語(yǔ)printf("%s\n", s)相同。
例4:
main()
{
char s[20], *f; /*定義字符串?dāng)?shù)組和指針變量*/
strcpy(s, "Hello! Turbo C2.0"); /*字符串?dāng)?shù)組變量賦值*/
f="Thank you"; /*字符串指針變量賦值*/
puts(s);
puts(f);
}
說(shuō)明:
(1). puts()函數(shù)只能輸出字符串, 不能輸出數(shù)值或進(jìn)行格式變換。
(2). 可以將字符串直接寫入puts()函數(shù)中。如:
puts("Hello, Turbo C2.0");
2. gets()函數(shù)
gets()函數(shù)用來(lái)從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤)讀取字符串直到回車結(jié)束, 但回車符 不屬于這個(gè)字符串。其調(diào)用格式為:
gets(s);
其中s為字符串變量(字符串?dāng)?shù)組名或字符串指針)。
gets(s)函數(shù)與scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s) 函數(shù)輸入字符串時(shí)存在一個(gè)問(wèn)題, 就是如果輸入了空格會(huì)認(rèn)為輸入字符串結(jié)束, 空格后的字符將作為下一個(gè)輸入項(xiàng)處理, 但gets() 函數(shù)將接收輸入的整個(gè)字符串直到回車為止。
例5
main()
{
char s[20], *f;
printf("What’s your name?\n");
gets(s); /*等待輸入字符串直到回車結(jié)束*/
puts(s); /*將輸入的字符串輸出*/
puts("How old are you?");
gets(f);
puts(f);
}
說(shuō)明:
(1). gets(s)函數(shù)中的變量s為一字符串。如果為單個(gè)字符, 編譯連接不會(huì)有錯(cuò)誤, 但運(yùn)行后會(huì)出現(xiàn)"Null pointer asignmemt"的錯(cuò)誤。
二、putchar()、getch()、getche()和getchar()函數(shù)
1. putchar()函數(shù)
putchar()函數(shù)是向標(biāo)準(zhǔn)輸出設(shè)備輸出一個(gè)字符, 其調(diào)用格式為:
putchar(ch);
其中ch為一個(gè)字符變量或常量。
putchar()函數(shù)的作用等同于printf("%c", ch);
例6:
#include
main()
{
char c: /*定義字符變量*/
c=’B’; /*給字符變量賦值*/
putchar(c); /*輸出該字符*/
putchar(’\x42’); /*輸出字母B*/
putchar(0x42); /*直接用ASCII碼值輸出字母B*/
}
從本例中的連續(xù)四個(gè)字符輸出函數(shù)語(yǔ)句可以分清字符變量的不同賦值方法。
相關(guān)推薦:計(jì)算機(jī)等考二級(jí)C語(yǔ)言備考:C語(yǔ)言/C++編譯過(guò)程北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |