|
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); /*從健盤(pán)輸入字符串*/ 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)?br> scanf("%10s", p); 程序運(yùn)行時(shí)一旦輸入字符個(gè)數(shù)大于10, p就不再繼續(xù)讀入, 而后面的一個(gè)讀入函數(shù)即scanf("%s", str)就會(huì)從第11個(gè)字符開(kāi)始 讀入。實(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<stdio.h> 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è)備(屏幕)寫(xiě)字符串并換行, 其調(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). 可以將字符串直接寫(xiě)入puts()函數(shù)中。如: puts("Hello, Turbo C2.0");
2. gets()函數(shù) gets()函數(shù)用來(lái)從標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))讀取字符串直到回車結(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<stdio.h> main() { char c: /*定義字符變量*/ c=''B''; /*給字符變量賦值*/ putchar(c); /*輸出該字符*/ putchar(''\x42''); /*輸出字母B*/ putchar(0x42); /*直接用ASCII碼值輸出字母B*/ }
從本例中的連續(xù)四個(gè)字符輸出函數(shù)語(yǔ)句可以分清字符變量的不同賦值方法。
2. getch()、getche()和getchar()函數(shù) (1) getch()和getche()函數(shù) 這兩個(gè)函數(shù)都是從鍵盤(pán)上讀入一個(gè)字符。其調(diào)用格式為: getch(); getche(); 兩者的區(qū)別是: getch()函數(shù)不將讀入的字符回顯在顯示屏幕上, 而getche()函數(shù)卻將讀入的字符回顯到顯示屏幕上。 例7:
#include<stdio.h> main() { char c, ch; c=getch(); /*從鍵盤(pán)上讀入一個(gè)字符不回顯送給字符變量c*/ putchar(c); /*輸出該字符*/ ch=getche(); /*從鍵盤(pán)上帶回顯的讀入一個(gè)字符送給字符變量ch*/ putchar(ch); }
利用回顯和不回顯的特點(diǎn), 這兩個(gè)函數(shù)經(jīng)常用于交互輸入的過(guò)程中完成暫停等功能。
例8:
#include<stdio.h> main() { char c, s[20]; printf("Name:"); gets(s); printf("Press any key to confinue..."); getch(); /*等待輸入任一鍵*/ }
(2) getchar()函數(shù) getchar()函數(shù)也是從鍵盤(pán)上讀入一個(gè)字符, 并帶回顯。它與前面兩個(gè)函數(shù)的區(qū)別在于:getchar()函數(shù)等待輸入直到按回車才 結(jié)束, 回車前的所有輸入字符都會(huì)逐個(gè)顯示在屏幕上。但只有第一個(gè)字符作為函數(shù)的返回值。 getchar()函數(shù)的調(diào)用格式為:
getchar();
例9: #include<stdio.h> main() { char c; c=getchar(); /*從鍵盤(pán)讀入字符直到回車結(jié)束*/ putchar(c); /*顯示輸入的第一個(gè)字符*/ getch(); /*等待按任一健*/ }
|