2009-04-17 164 views
1

我需要從用戶(僅5)接受5個的一串數字。 我應該使用需要用戶輸入串/檢查字符串長度(C++)

istringstream 

對於相同的?

我不能擺脫這樣的事情?

int main() 
{ 
    char *InputMain; 
    InputMain=(char *)malloc(5+1); 
    cout << "Enter the number : " <<endl; 
    cin.getline (InputMain, 5, '\n');    // Input goes into InputMain 
    cout << "The number entered is : " << InputMain <<endl; 
    cin.get(); 
} 

然後是下一部分..

你怎麼我確保用戶僅輸入5個字符?也許如果用戶輸入超過5個字符,我應該顯示一個警告,說只允許5個字符。

還有一個問題,因爲這本質上是一個字符串,我需要驗證輸入只有數字通過解析字符串中的每個字符並檢查相應的ASCII值(數字)..這種方法是正確的嗎?

+0

這聽起來很像功課 – lothar 2009-04-17 17:07:51

回答

4

不幸的是,限制輸入的字符的數量在C++中沒有可移植的方法。但是無論您使用哪種平臺都會提供一些機制:例如在Windows上,查找Console functions

如果用普通的舊C++輸入輸出流輸入去從cin,這是一個好主意,閱讀的初始文本爲std::string使用istream& getline(istream&, string&) - 這將防止緩衝區溢出,因爲string S調整是必要的。 (您涉及getline(InputMain, 5, '\n')碼在技術上是安全的,因爲它不會讀取超過5個字符爲InputMain,但是這個代碼是脆弱的 - 如果你以後決定要6個字符,你可以很容易忘記更新您的來電malloc(),領先。死機另外,你需要記住free(InputMain)但正如我所說,使用string代替)

關於解析:。

無論您使用getline(cin, str)或讀取輸入到string一些特定平臺的代碼,一旦它在那裏,你需要以數字的形式出來。這就是istringstream類是有用的 - 它可以讓你把一個現有string作爲流從閱讀,因此,您可以使用格式化的輸入>>操作:如果您使用C++輸入輸出流

string str; 
if (!getline(cin, str)) { 
    cerr << "Something went seriously wrong...\n"; 
} 

istringstream iss(str); 
int i; 
iss >> i; // Extract an integer value from the stream that wraps str 

if (!iss) { 
    // Extraction failed (or a more serious problem like EOF reached) 
    cerr << "Enter a number dammit!\n"; 
} else if (i < 1000 || i > 9999) { 
    cerr << "Out of range!\n"; 
} else { 
    // Process i 
} 

,你可實際上只是從cin直接提取的,而不是通過string去和istringstream

int i; 
cin >> i; // Extract an integer value from cin 

然而,這可能會有細微的不良影響;值得注意的是,用戶輸入的行上的任何附加字符(特別是按Enter鍵時輸入的'\n')將保留在輸入緩衝區中,以便在接下來的<<操作中讀取。通常這並不重要,但有時確實如此:例如如果你跟進cin.get();,預計這將等待一個按鍵,它不會 - 它只是讀取'\n'(或第一個非數字字符的用戶輸入)。

+0

你的意思是我應該使用這樣的事情? #include #include using namespace std; INT主() { 串InputMain; cout <<「輸入數字:」<< endl; getline(cin,InputMain); // cin >> InputMain; // --->這樣也能工作嗎? cout <<「輸入的數字是:」<< InputMain << endl; cin.get(); } – halluc1nati0n 2009-04-17 10:47:30