while (cin>>str)退出死循環


今天在練習的時候突然發現了這個問題,百度之感覺還挺常見的,故記之!

//題目描述
//
//寫出一個程序,接受一個十六進制的數值字符串,輸出該數值的十進制字符串。
//
//輸入描述 :
//輸入一個十六進制的數值字符串。
//
//
//輸出描述 :
//輸出該數值的十進制字符串。

#include<iostream>    
#include<string>
using namespace std;

void fun(string str)
{
    if (str.empty())
    {
        return;
    }
    int j=0;
    int result=0,n=1;
    //while (str[i++] != 'x');  //讀到x的下一個字符
    int len = str.size()-1;

    while (str[len]!='x') //如果沒有x,一直減下去,有錯
    {
        if (str[len]<='Z'&&str[len]>='A')
            j = str[len] - 'A' + 10;  //字符轉化為整形
        else
        {
            j = str[len] - '0';
        }
        result = j*n + result;
        n =n*16;
        len--;
        if (len==0)
        {
            break;
        }
    }
    cout << result << endl;
}
int main()
{
    string str;
 //     while (cin>>str)   //死循環居然也通過了  //說在windows下輸入ctrl+Z即退,有時按兩次,
    //{
    //    fun(str);
    //} 

    //cin >> str;
    //while (str!=" ")   //解決死循環,貌似沒有
    //{
    //    fun(str);
    //    cin >> str;
    //}



    //istream& getline(istream& is, string& str, char delim);  //返回值是istream類型,不能作為while退出的判斷條件
    //istream& getline(istream& is, string& str);
    //Return Value
    //    The same as parameter is.
    getline(cin,str);
    while (str != " ")   //解決死循環,空格鍵退出
    {
        fun(str);
        getline(cin, str);
    }
    return 0;
}
//
//#include<iostream>
//#include <vector>
//#include <string>
//using namespace std;
//int main()
//{
//    vector<string> vect;
//    string str;
//    while (cin >> str)
//    {
//        if (str == "0")   //這種方式也可以退出
//            break;
//        vect.push_back(str);
//    }
//    return 0;
//}

解釋有:

    在 C++Primer 中,作者經常使用 while(cin>>word) 類似的語法,但是如何結束,可能會出現疑惑。有的時候需要兩次快捷鍵才能結束循環,有的時候卻只需要一次循環。

    在 Unix 系統中的實際的現象為:
    * 當輸入為“字符串,回車,Ctrl+D”的時候,跳出循環;
    * 當輸入為“字符串,Ctrl+D,回車”的時候,不會跳出循環;
    * 當輸入為“字符串,Ctrl+D,回車,Ctrl+D”的時候,跳出循環;
    * 當輸入為“字符串,Ctrl+D,Ctrl+D”的時候,跳出循環;
    在 Windows 系統中的實際現象待考察。
    具體原因解釋如下:
    輸入(cin)緩沖是行緩沖。當從鍵盤上輸入一串字符並按回車后,這些字符會首先被送到輸入緩沖區中存儲。每當按下回車鍵后,cin 就會檢測輸入緩沖區中是否有了可讀的數據。
    cin 還會對鍵盤上是否有作為流結束標志的 Ctrl+Z 或者 Ctrl+D 鍵按下作出檢查,其檢查的方式有兩種:阻塞式以及非阻塞式。
    阻塞式檢查方式指的是只有在回車鍵按下之后才對此前是否有 Ctrl+Z 組合鍵按下進行檢查,非阻塞式樣指的是按下 Ctrl+D 之后立即響應的方式。如果在按 Ctrl+D 之前已經從鍵盤輸入了字符,則 Ctrl+D的作用就相當於回車,即把這些字符送到輸入緩沖區供讀取使用,此時Ctrl+D不再起流結束符的作用。如果按 Ctrl+D 之前沒有任何鍵盤輸入,則 Ctrl+D 就是流結束的信號。
    阻塞式的方式有一個特點:只有按下回車之后才有可能檢測在此之前是否有Ctrl+Z按下。還有一個特點,如果輸入緩沖區中有可讀的數據則不會檢測 Ctrl+Z(因為有要讀的數據,還不能認為到了流的末尾)。還有一點需要知道,Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字符,所以不會跟其它從鍵盤上輸入的字符一樣能夠存放在輸入緩沖區。
    Windows系統中一般采用阻塞式檢查 Ctrl+Z、Unix/Linux系統下一般采用非阻塞式的檢查 Ctrl+D。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM