今天在練習的時候突然發現了這個問題,百度之感覺還挺常見的,故記之!
//題目描述 // //寫出一個程序,接受一個十六進制的數值字符串,輸出該數值的十進制字符串。 // //輸入描述 : //輸入一個十六進制的數值字符串。 // // //輸出描述 : //輸出該數值的十進制字符串。 #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。
* 當輸入為“字符串,回車,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。