2015-10-02 37 views
0

所以我想驗證用戶只輸入文本而不輸入數字。如果輸入了任何數字,我再次要求她輸入。我認爲這會做的伎倆,但它似乎並沒有工作:驗證輸入和getline()函數

#include <iostream> 

using namespace std; 

int main() 
{ 
    string name = ""; 

    cout << "Enter name: "; 
    getline(cin, name); 

    while (!cin) // or cin.fail() 
    { 
     cout << "Numbers are not allowed, input name again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); // is this even necessary since getline() already consumes spaces and new lines? 
     getline(cin, name); 
    } 
} 

因爲name變量是string型的,當它接收到一個號碼,不應該cin對象失敗?我怎樣才能驗證它,並確保在輸入號碼時再次提示輸入?另外,出於好奇,因爲我已經問過了,如果用戶輸入如下內容:Scarlett9356,重新提示輸入的好方法是什麼?謝謝。

+1

你可以從輸入流中讀取「1234」作爲數字或字符串:它只是一串字符 – BeyelerStudios

+0

這裏真正困難的事情是大局。什麼*是一個人的有效名字?它比人們想象的要複雜得多:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/當然,對於玩具程序來說,通常足以確保它只包含Aa-Zz和空格。 –

+0

很棒的閱讀,感謝分享! @ChristianHackl – Blueshift

回答

1

您可以通過這樣做驗證您的字符串中沒有數字:

#include <iostream> 

using namespace std; 

bool validName(string name) 
{ 
    if(name.length() == 0) 
     return false; // `name` cannot be empty 

    for(int i = 0; i < name.length(); i++) 
     if(name[i] >= '0' && name[i] <= '9') 
      return false; // There is a number in `name` 

    return true; // `name` is valid 
} 

int main() 
{ 
    string name = ""; 

    cout << "Enter name: "; 
    getline(cin, name); 

    while (!validName(name)) 
    { 
     cout << "Numbers are not allowed, input name again: "; 
     cin.clear(); 
     cin.ignore(1000, '\n'); // is this even necessary since getline() already consumes spaces and new lines? 
     getline(cin, name); 
    } 
} 
+0

謝謝,這對我來說很好。當我運行它時,按一次輸入將跳到下一行,再次按下enter鍵實際上會停止程序。我註釋了'cin.ignore()'行,並且解決了該問題的第一部分,但現在只需按回車就可以停止該程序。難道是因爲'for'循環需要一些值來檢查'我 Blueshift

+0

@Blueshift:我編輯了'validName'函數來反映這個新的需求! ;-)您可以爲該功能添加更多條件! – mbinette

+0

從你身上學到了! – Blueshift

1

因爲name變量是字符串類型,所以cin對象在接收到數字時不應該失敗?

編號由數字組成的輸入作爲字符串也是有效的。

您需要使用不同的策略來製作無效輸入。

我會建議沿着線的東西:

bool is_valid_input(std::string const& name) 
{ 
    bool is_valid = true; 
    // Figure out the logic for deciding when the input is not valid. 

    // ... 

    if (!is_valid) 
    { 
     cout << "Numbers are not allowed, input name again: "; 
    } 

    return is_valid; 
} 

int main() 
{ 
    string name = ""; 

    do 
    { 
     cout << "Enter name: "; 
     getline(cin, name); 
    } 
    while (!is_valid_input(name)); 
} 
+0

明白了,謝謝。謹慎發佈一些示例代碼或詳細說明您的回覆? – Blueshift

0

如果你想你的輸入限制爲僅考慮字符串沒有一個數字,那麼你可以使用std::any_ofstd::isdigit

std::string name = ""; 

std::cout << "Enter name: "; 
std::getline(std::cin, name); 

while (std::any_of(name.begin(), name.end(), [](char ch) { return std::isdigit(ch); })) 
{ 
    std::cout << "Numbers are not allowed, input name again: "; 
    std::getline(std::cin, name); 
}