2015-05-21 40 views
1

我正在閱讀string manipulations in C++。這裏筆者提出的一塊,如果有兩個空格的字符串這是檢驗碼,看看string :: find中是否有兩個空格,這個代碼中的錯誤?

string text; 
getline (cin, text); 

string::size_type position = text.find (' '); 
if (position != string::npos) 
{ 
    if (text.find (' ', position+1) != string::npos) 
    { 
     cout << "Contains at least two spaces!" << endl; 
    }else 
    { 
     cout << "Contains less than two spaces!" << endl; 
    } 
}else 
{ 
    cout << "Contains no spaces!" << endl; 
} 

筆者指出,有在上面的代碼中的錯誤。但是我看不到它,代碼對我來說看起來很不錯。我錯過了什麼嗎?

+1

我可以看到的唯一問題是,如果第一個空格是字符串的最後一個字符... – tangrs

+1

從網頁:_這個可選參數的要求是它必須指示字符串中的有效位置,這意味着該值必須介於0和length-1_之間。 「位置+1」是否保證在該範圍內? – Barmar

+0

是的,作者說。但是'std :: string :: find'實際上接受的數字大於字符串的長度,如[這裏](http://www.cplusplus.com/reference/string/string/find/) – Allanqunzi

回答

4

該網站的作者是錯誤的,程序中沒有錯誤。

他認爲有一個要求find的可選參數必須介於0和length-1之間。如果是這種情況,那麼如果第一個空格是字符串的最後一個字符,則程序將失敗,因爲position將爲length-1,因此position+1將爲length,該值超出該範圍。

但實際上,如果position參數太高,它只會返回string::npos。所以沒有問題。

+0

你從哪裏得到這個要求?如果起始位置參數大於字符串的長度,basic_string :: find將返回npos。 – Praetorian

+0

我從他鏈接到的網頁得到它。如果這不是真正的要求(它看起來不是這樣),那麼作者誤以爲程序中存在一個錯誤。 – Barmar

+0

我剛剛測試過,'find'的參數大於'length-1'。而對於'text =「a」(一個空格),它實際上輸出「包含少於兩個空格!」;對於'text =「a」(兩個空格),它輸出「包含至少兩個空格!」。 – Allanqunzi

相關問題