C Primer Plus 第8章 字符輸入/輸出和輸入確認 8.5 建立更友好的界面

8.5.1 使用緩衝輸入函數

問題在於緩衝輸入須要您按下回車鍵來提交您的輸入。這一動做還傳輸一個程序必須處理的換行符。您必須使程序至少可以處理這種狀況 。ui

程序清單8.4 guess.c程序code

/*guess.c--一個低效且錯誤的猜數程序*/
#include <stdio.h>
int main (void)
{
    int guess=1;
    char response;  /*添加一個char變量存儲響應*/
    printf("Pick an integer from 1 to 100.I will try to guess ");
    printf("it.\nRespond with a y if my guess is right and with");
    printf("\nan n if it is wrong.\n");
    printf("uh...is your number %d?\n",guess);
    while ((response = getchar())!='y')  /*獲取用戶響應並和y進行比較*/
    {
        if (response=='n')  /*if else 來區別字符n和以個的字符*/
            printf("Well,then,is it %d\n",++guess);
        else
            printf("Sorry,I understand only y or n.\n");
        while (getchar()!='\n')    /*跳過輸入的其餘部分,包括換行符*/
            continue;
    }
    printf("I knew I cloud do it !\n");
    return 0;
}

8.5.2 混合輸入數字和字符隊列

getchar()讀取每一個字符,包括空格、製表符和換行符;而scanf()在讀取數字時則會跟過空格 、製表符和換行符。get

程序清單 8.5 showchar1.cit

/*showchar1.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 two integers; \n");
    while ((ch=getchar())!='\n')
    {
        scanf("%d %d",&rows,&cols);
        display(ch,rows,cols);
        printf("Enter another character and two integers; \n");
        printf("Enter a newlines 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');  /*結束本行,開始新一行*/
    }
}

該程序開始時表現很好。您輸入c 2 3,程序就如期打印2行c字符,每行3個。而後該程序提示輸入第二組數據,並在您尚未能作出響應以前就退出了。哪裏出錯了呢?又是換行符,此次是緊跟在第一個輸入行的3後面的那個換行符。scanf()函數將該換行符留在了輸入隊列中。與scanf()不一樣,getchar()並不跳過該換行符。因此在循環的下一個週期,在您有機會輸入任何其餘內容以前,這一換行符由getchar()讀出,而後將其賦值給ch,而ch爲換行符正是循環終止的條件。io

要解決這一問題,該程序必須跳過一個輸入週期中鍵入的最後一個數字與下行開始處鍵入的字符之間的全部推行符或空格 。另外,若是getchar()判斷以外還能夠在scanf()階段終止該程序,則會更好。class

程序清單8.6  showchar2.c程序變量

/*showchar1.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 two integers; \n");
    while ((ch=getchar())!='\n')
    {
        if(scanf("%d %d",&rows,&cols)!=2)
            break;    /*在scanf()階段添加判斷終止循環*/
        display(ch,rows,cols);
        while(getchar()!='\n')
            continue;    /*跳過輸入的剩餘部分,包括換行符*/
        printf("Enter another character and two integers; \n");
        printf("Enter a newlines 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');  /*結束本行,開始新一行*/
    }
}

while語句使程序剔除scanf()輸入後的全部字符,包括換行符。這樣就讓循環準備好讀取下一行開始的第一個字符。這意味着您能夠自由地輸入數據。object

經過使用一個if語句和一個break,若是scanf()的返回值不是2,您就停止了程序。這種狀況在有一個或兩個輸入值不是整數或者遇到文件尾時發生。

相關文章
相關標籤/搜索