2011-11-19 89 views
3

我有一個有符號整數變量 當我這樣做在main中,它也給我「錯誤」的整數值以及。isdigit問題與cin

int main(){ 
    unsigned int a; 
    while(cin>>a){ 
     if(!isdigit(a)){ 
      cout<<"Error"<<endl; 
     } 
    } 
} 

[編輯]: 感謝所有的答覆,我明白了這個問題。現在,我該如何檢查cin是否只讀取整數而不是字母或任何其他字符。有沒有在c + +中的任何功能。由於

+0

可能是因爲你的字符r正在簽署擴展。請參閱http://stackoverflow.com/questions/8083083/how-do-you-cope-with-signed-char-int-issues-with-standard-library – Mordachai

回答

3

問題是,isdigit()需要一個字符,而不是一個整數。

它當角色是'0''1',等返回true ...其中有48 ASCII值,49等..

嘗試它,而不是這樣:

char a; 
while(cin>>a){ 
    if(!isdigit(a)){ 
+0

*「其中有48位,49位等的ASCII值」* - 除非字符集像ebcdic一樣愚蠢。無可否認,我從來沒有見過這樣的實施。 –

+0

哇,我從來沒有聽說過ebcdic ...漂亮的老派... – Mysticial

+0

我見過一個實際上有EBCDIC解析的實現:Perl的CGI.pm.誠然,這不是C++,但仍然,... – moshbear

1

試試這個:

std::cout << "Is digit : " << isdigit('9'); 

然後通過閱讀:

http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

如果你仍然有問題,讓我們知道。

+0

感謝您的鏈接...所以,我怎麼檢查cin是否只讀整數而不是字母或其他? – user1035927

+1

@ user1035927如果您閱讀了鏈接和您將瞭解的示例。我喜歡這種方式,而不是直接給你解決方案。函數的輸入必須是數字的ASCII值。查看Mysticial的答案,瞭解更多細節。 – FailedDev

1

如果你想確保你成功閱讀你想要的類型,你可以使用istream :: good()

unsigned int a; 
std::cin >> a; 
if(!std::cin.good()) { 
    std::cout << "Error!\n"; 
} else { 
    std::cout << a; 
} 
+0

嗨Bames,這個同樣的事情在一個while循環中完成?,因爲我必須不斷從文本文件中讀取輸入。謝謝 – user1035927

+0

是的,你可以在循環中使用它。如果用戶的輸入存在錯誤,但您希望清理並繼續讀取輸入,則可以使用clear()成員函數清除流中的錯誤。 – bames53