1. 程式人生 > >【C語言練習題】編寫一個程式,它從標準輸入讀取C原始碼,並驗證所有花括號都正確成對出現

【C語言練習題】編寫一個程式,它從標準輸入讀取C原始碼,並驗證所有花括號都正確成對出現

《C和指標》課後練習題

 

問:編寫一個程式,它從標準輸入讀取C原始碼,並驗證所有花括號都正確成對出現。

 

程式碼

思路:在while迴圈條件中讀取我輸入的字元,只有當輸入緩衝區沒有資料或者我這裡產生回車符'\n'時,才會判斷條件不成立。counter這個變數用來標記'{ }'是否成對出現(當有'{'讀入時,counter++,當有'}'讀入時,counter--)。另外,'}'為了和前面的'{'完成配對,和最前面未配對的'{'相互匹配,這時候counter不可能是負數。最後當用戶輸入結束時(按下回車鍵),程式也根據counter是否為0,來判斷花括號是否成對出現了。

#include <stdio.h>
#include <string.h>

int main(void)
{
        int ch;
        int counter=0;

        printf(">>");
        while( (ch = getchar()) != EOF && ch != '\n')
        {
                if('{' == ch)
                {
                        counter++;
                }
                else if('}' == ch)
                {
                        counter--;
                }

                if ( counter < 0 )
                {
                        printf("input error\n");
                        return -1;
                }
        }

        if ( 0 == counter )
        {
                printf("success!\n");
        }
        else
        {
                printf("failed!\n");
        }

        return 0;
}

 

實驗結果

 

 

關於行緩衝

這裡遇到一個小插曲

本來以為當我輸入 '}' 的時候,在程式中會立即判斷執行 return ,然後退出程式。但是事實是,在我按下回車符'\n'時,才有結果顯示。 

導致這種結果的原因呢,就是這個getchar函數了。

意思是,我通過按鍵輸入的字元資料不會立即被getchar這個函式處理,先儲存到一個緩衝區中。當我按下回車符'\n'後,函式getcahr再從緩衝區中一個一個讀取字元,這就是行緩衝機制。總的來說這個過程是在我回車之後進行的。