2012-09-19 31 views
5

我在計算機實驗室,沒有一位導師可以找出爲什麼我的getline無法正常工作。它沒有正確存儲信息(只存儲1或2個字母)。有誰知道這是爲什麼?爲什麼getline如此不一致?

void addMovie(Inventory movie[], int &count) 
{ 
    string s; 
    int i; 

    cout << "Please enter the SKU " << endl; 
    cin >> i; 
    movie[count].sku = i; 

    cout << "Please enter the name of the movie you wish to add " << endl; 

    cin.ignore('\n'); 
    getline(cin, s, '\n'); 
    movie[count].title = s; 

    count++; 
} 
+2

作爲一個說明,你或許應該使用某種比C數組標準集裝箱。你似乎沒有在這裏做任何界限檢查。 – tadman

+0

您不必在'getline'中輸入''\ n''。這是默認的分隔符。 – chris

回答

8

std::istream::ignore(即cin.ignore())的第一個參數是字符丟棄的數量。 '\n'的值的ASCII碼爲10,因此'\n'被隱式轉換爲整數(最有可能爲10,但如果使用不同的編碼,EBCDIC可能會使用21),這就是多少個字符被忽略,剩下幾個。

你真正想要的是丟棄的最大可能數量,直到找到一個換行:

#include <limits> //for numeric_limtis 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
+0

編譯器是否應該警告這種隱式轉換? –

+0

@muntoo,不,這是標準定義的常見轉換。 C++不區分'int'和'char'作爲需要用戶保證轉換的獨立類型,就像Java一樣,所以兩者可以互換使用。你可以在'tolower'這樣的函數上看到這個,它會返回一個'int'。儘管如此,我相信這個來自C。整數和字符之間的整個事情可能來自C,但我不記得了。在SO上某處可能會有一些很好的討論。 – chris

+0

@muntoo,只是爲了指出一個例子,這是'std :: string'沒有一個構造函數接受一個char的絕好理由。如果你做了'std :: string str(10);'期待一個長度爲10的字符串,它會隱含地轉換爲一個字符並用它來代替。它也適用於其他方式。我剛剛記得的另一件事是C的字符文字有'int'類型,而不是'char'。我忘記了C是否有'char',但是即使擁有它,像'tolower'這樣的東西也必須先將字符轉換爲'char'。 – chris