程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++ cin 作為while條件(詳解)

c++ cin 作為while條件(詳解)

編輯:關於C++

c++ cin 作為while條件(詳解)。本站提示廣大學習愛好者:(c++ cin 作為while條件(詳解))文章只能為提供參考,不一定能成為您想要的結果。以下是c++ cin 作為while條件(詳解)正文


本文一切測試在windows clion中進行

在clion中,ctrl +z並不是文件結束符

在cmd中運行,只需要ctrl+z再加回車就可以得到正確結果

1、cin

cin是C++編程語言中的標准輸入流對象,即istream類的對象。cin主要用於從標准輸入讀取數據,這裡的標准輸入,指的是終端的鍵盤。此外,cout是流的對象,即ostream類的對象,cerr是標准錯誤輸出流的對象,也是ostream 類的對象。這裡的標准輸出指的是終端鍵盤,標准錯誤輸出指的是終端的屏幕。

在理解cin功能時,不得不提標准輸入緩沖區。當我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠將這個字符串送入到緩沖區中,那麼敲入的這個回車鍵(\r)會被轉換為一個換行符\n,這個換行符\n也會被存儲在cin的緩沖區中並且被當成一個字符來計算!比如我們在鍵盤上敲下了123456這個字符串,然後敲一下回車鍵(\r)將這個字符串送入了緩沖區中,那麼此時緩沖區中的字節個數是7 ,而不是6。

cin讀取數據也是從緩沖區中獲取數據,緩沖區為空時,cin的成員函數會阻塞等待數據的到來,一旦緩沖區中有數據,就觸發cin的成員函數去讀取數據。當cin>>從緩沖區中讀取數據時,若緩沖區中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略並清除,繼續讀取下一個字符,若緩沖區為空,則繼續等待。但是如果讀取成功,字符後面的分隔符是殘留在緩沖區的,cin>>不做處理。

使用一個istream的對象作為條件時,效果是檢查流的狀態。若流有效,則檢測成功,返回true。當遇到文件結束符或者無效的輸入(比如用一個字符來作為一個整型數的輸入時),istream的對象狀態會變為無效。

總而言之:

(1)  輸入數據時需要敲回車鍵才能將數據送到緩存器,cin才能讀取緩存區的數據。

(2) 當cin遇到文件結束符(windows中為:ctrl +Z , Unix 中為:ctrl +D),或無效輸入才能使cin狀態無效。

一下這段測試代碼將說明以上問題。

代碼作用: 統計輸入值中數據連續出現的次數。

因為無法判斷輸入數據的個數,所以無法采用一個定值來控制循環次數。這裡我們使用cin來作為if 條件:

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main() {

  cout << "Enter a list of integers:" << std::endl;
  int currVal = 0;
  int val = 0;
  int cnt = 0;

  /*讀入第一個輸入的數據*/
  if ( cin >> currVal ){
    cnt = 1;
    /*循環讀入之後的數據*/
    while( cin >> val ){
      /*如果當前讀入的數據val與之前的數據currVal相等,cnt++*/
      if (currVal == val) {
        ++cnt;
      } else {
        /*如果不相等,輸出之前數據currVal連續出現的次數,同時重新統計當前數據的連續出現次數*/
        cout << currVal << " occurs " << cnt << " times. " << endl;
        currVal = val;
        cnt = 1;
      }
    }
     /*打印最後一個數據的連續出現次數*/
    cout << currVal << " occurs " << cnt << " times. " << endl;
  }
  return 0;
}

(1)控制台輸入 1 2 3 4 5 6 7加回車:

7的統計並沒有顯示,因為這個時候我們只是將數據push到了緩沖區,while中的cin讀取到7,流的檢測狀態是true,所以並沒有退出循環,還在等待下一個輸入數據,不能執行while循環之外的代碼,因此不能打印最後下一個數據7。

(2)控制台輸入 1 2 3 4 5 6 7加ctrl+D:

 直接以ctrl+d結束數據,數據1到7沒有提交到緩沖區,而if中的cin直接讀取到文件結束符,流狀態檢測為false,if中的代碼不能執行,直接結束程序運行。

(3)控制台輸入1 2 3 4 5 6 7加回車:

再輸入ctrl+D:

1到6的輸出如(2)中所述,等我們再次輸入文件結束符號時,cin流狀態為false,結束while循環,因此執行while循環之外的代碼,打印出最後一個數據7 的統計次數。

(4)控制台輸入1 2 3 4 5 6 7 t 加回車:

我們輸入1到7和t之後,再enter,將數據push到緩沖區。在while循環的條件中,cin逐個讀入到val中,再執行循環體中的代碼,最後讀到t時,企圖將字符存入到int型的變量中,無效輸入導致流狀態為false,種植while循環,可以打印出最後一個數據的統計信息。

以上這篇c++ cin 作為while條件(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved