假如你的程序同時需要使用getchar()進行字符輸入和使用 scanf()進行數字輸入.這兩個函數的每一個都能很好的完成工作,
但是它們不能很好地混合在一起.這是因為getchar()讀取每個字符,包括空格,制表符和換行符;而scanf()在讀取數字時候則
會跳過空格,制表符和換行符.下面是個例子,
char1.cpp
/*C語言一個I/O問題程序*/
#include<stdio.h>
void display(char cr,int lines,int width);
int main(void)
{
? int ch;
? int rows,cols;
? printf("Enter a character and tow integers:\n");
? while((ch=getchar())!='\n')
? {
???? scanf("%d %d",&rows,&cols);
???? display(ch,rows,cols);
???? printf("Enter another character and tow integers;\n");
???? printf("Enter a newline to quit.\n");
? }
? printf("Bye.\n");
? return 0;
}
void display(char cr,int lines,int width)
{
? int row ,col;
? for(row =1;row<=lines;row++)
? {
??? for(col=1;col<=width;col++)
??? {
????? putchar(cr);
?????? }
????? putchar('\n');
? }
}
結果輸出:
Enter a character and tow integers:
d 3 2
dd
dd
dd
Enter another character and tow integers;
Enter a newline to quit.
Bye.
Press any key to continue...
可以看見緊跟在2后面的那個換行符,scanf()函數將該換行符留在了輸入隊列中.而getchar()并不跳過換行符,所以在循環的
下一周期,在你有機會輸入其他內容之前,這個換行符由getchar()讀出,然后將其賦值給ch,而ch為換行符正是終止循環的條件.
要解決這個問題,必須跳過一個輸入周期中鍵入的最后一個數字與下一行開始處鍵入的字符之間的所有換行符或空格.
改進如下:char2.cpp
/*C語言一個I/O問題程序修改版本*/
#include<stdio.h>
void display(char cr,int lines,int width);
int main(void)
{
? int ch;
? int rows,cols;
? printf("Enter a character and tow integers:\n");
? while((ch=getchar())!='\n')
? {
??? if( scanf("%d %d",&rows,&cols)!=2)
??? break;
???? display(ch,rows,cols);
???? while(getchar()!='\n')????? /*剔除掉scanf()輸入后的所有字符.*/
???? {
??????? printf("1");????????? /*后面有多少字符就輸出多少個1*/
??????? continue;
???? }
???? printf("Enter another character and tow integers;\n");
???? printf("Enter a newline to quit.\n");
? }
? printf("Bye.\n");
? return 0;
}
void display(char cr,int lines,int width)
{
? int row ,col;
? for(row =1;row<=lines;row++)
? {
??? for(col=1;col<=width;col++)
??? {
????? putchar(cr);
?????? }
????? putchar('\n');
? }
}
輸出結果:
Enter a character and tow integers:
d 3 4
dddd
dddd
dddd
Enter another character and tow integers;
Enter a newline to quit.
d 3 4
dddd
dddd
dddd
11Enter another character and tow integers;
Enter a newline to quit.
?
?
?
?
posted on 2006-11-03 14:12
matthew 閱讀(2593)
評論(1) 編輯 收藏 所屬分類:
數據結構與算法設計