1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      C與C++中標(biāo)準(zhǔn)輸入實現(xiàn)方式上的一點區(qū)別

      更新時間: 2007-05-11 09:15:11來源: 粵嵌教育瀏覽量:770


        剛開始學(xué)C語言時遇到一個問題,如下代碼:

        以下是引用片段:
        #include
        int main()
        ...{
        char a,b;
        printf("Please input the first character:");
        scanf("%c", &a);
        printf("Please input the second character:");
        scanf("%c", &b);
        printf("The two characters are %c, %c", a, b);
        return 0;
        }


        程序運行結(jié)果如下:



       而下面這段程序卻可以正常運行:

      以下是引用片段:
        #include
        int main()
        ...{
        char a;
        int b;
        printf("Please input the first character:");
        scanf("%c", &a);
        printf("Please input the second integer:");
        scanf("%d", &b);
        printf("The two characters are %c, %d", a, b);
        return 0;
        }


        運行結(jié)果如下:



        當(dāng)時對這個問題很困惑,時間一長就慢慢淡忘了。

        昨天一個同學(xué)問到一個C++運算符重載的問題,如下代碼,其中的while循環(huán)起什么作用,好像注釋掉后程序運行沒什么差別:

      以下是引用片段:
        iostream& operator >> (iostream& is, b& s)
        ...{
        char temp[b::MAX] = ...{0};
        is.get();
        is.get(temp, b::MAX);
        if(strlen(temp)>0)
        ...{
        strncpy(b.str, temp, b::MAX);
        }
        while(is && is.get()!=' ')
        ...{
        continue;
        }
        return is;
        }


        其中,b為一個自定義的類型,其中含有一個 char str[b::MAX] 的私有成員,b::MAX為一個代表字符串長度的宏定義。

        可見,當(dāng)通過>>輸入字符串的長度超過b::MAX長度時,while循環(huán)就起作用了,它會丟棄超過b::MAX長度的輸入緩沖區(qū)的內(nèi)容,直到換行符出現(xiàn)為止,實際上就是一個清緩沖區(qū)的功能,以待下一次重新輸入字符串。為了驗證我的分析,做了如下測試:

      以下是引用片段:
        b b1, b2;
        cin >> b1;
        cin >> b2;
        b1.show();
        b2.show();

        果然,當(dāng)輸入字符串小于b::MAX時一切正常,當(dāng)超過b::MAX時,當(dāng)輸入完個字符串回車后,沒等輸入第二個字符串,程序就把b1和b2的內(nèi)容都顯示出來了,而b2 的內(nèi)容正是輸入的字符串超過b::MAX長度的部分,說明前面的分析是正確的。

        今天又想起這個問題,突然聯(lián)想到以前C語言的兩個scanf連用產(chǎn)生的問題,靈機一動,難道也是輸入緩沖區(qū)沒有自動清空產(chǎn)生的問題?當(dāng)連續(xù)用scanf輸入兩個字符的時候,輸入個字符后回車,結(jié)果換行符被當(dāng)作第二個字符輸入了,scanf可不會區(qū)分什么換行符還是普通字符,而當(dāng)輸入一個字符,再輸入一個整數(shù)時,因為類型不匹配的原因,scanf會將換行符忽略而等待輸入正確的整數(shù)后才返回,所以得到了正確的結(jié)果,哈哈,原來如此!!!

        不禁又想,C++中引入了新的iostream流庫,它又是怎樣處理這個問題的呢?于是做了下面的實驗:

      以下是引用片段:
        #include
        using namespace std;
        int main()
        ...{
        char a, b;
        cout << "Please input the first character:";
        cin >> a;
        cout << "Please input the second character:";
        cin >> b;
        cout << a << "," << b;
        return 0;
        }

        當(dāng)輸入a回車,輸入b回車時,運行結(jié)果如下:


        當(dāng)連續(xù)輸入多個字符時,運行結(jié)果如下:


        可見,C++中的標(biāo)準(zhǔn)輸入流已經(jīng)對于換行符做了處理,看來在C++中利用標(biāo)準(zhǔn)輸入處理特殊字符要自己做一些工作了 .

      免費預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 伊人久久大香线蕉综合5g孕妇 | 亚洲日韩欧美九九精品综合网 | 亚洲男人中文字幕一区 | 久久er精品77视频 | 视频区国产亚洲.欧美 | 激情视频一区二区三 |