2012-09-19 19 views
5

Jestem w laboratorium komputerowym i żaden z tutorów nie może zrozumieć, dlaczego mój getline nie działa poprawnie. Nie zapisuje poprawnie informacji (przechowuje tylko 1 lub 2 litery). Czy ktoś wie, dlaczego tak się dzieje?Dlaczego getline jest tak niespójny?

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

Jako notatkę, należy prawdopodobnie przy użyciu pewnego rodzaju standardowym kontenerze niż tablica C-stylu. Wydaje się, że nie robisz tutaj żadnych ograniczeń. – tadman

+0

Nie musisz też wstawiać '' \ n'' na 'getline'. Jest to domyślny ogranicznik. – chris

Odpowiedz

8

std::istream::ignore (tj cin.ignore()) jest pierwszym argumentem jest liczbą znaków do usunięcia. Wartość '\n' ma kod ASCII równy 10, więc '\n' jest niejawnie konwertowany na liczbę całkowitą (najprawdopodobniej 10, ale może się różnić, jeśli używane jest inne kodowanie - EBCDIC używa 21), a to liczba ignorowanych znaków zostawiając kilka pozostałych.

co rzeczywiście chcę to wyrzucić maksymalną możliwą liczbę aż do znalezienia nowej linii:

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

Czy kompilator nie powinien ostrzegać o tej niejawnej konwersji? –

+0

@muntoo, Nie, to typowa konwersja dobrze zdefiniowana przez standard. C++ nie rozróżnia "int" i "char" jako oddzielnych typów wymagających przekonania użytkownika do konwersji, tak jak robi to Java, więc oba mogą być używane zamiennie. Widać to na funkcjach takich jak 'tolower', które pobiera i zwraca' int'. Ten jednak pochodzi z C, jak sądzę. Cała sprawa między intami i znakami może pochodzić z C, ale nie pamiętam. Prawdopodobnie jest tam jakaś dobra dyskusja gdzieś na SO. – chris

+0

@muntoo, Aby wskazać przykład, jest to doskonały powód, dla którego 'std :: string' nie ma konstruktora z pojedynczym znakiem. Jeśli zrobiłeś 'std :: string str (10);' spodziewając się łańcucha o długości 10, to niejawnie skonwertowałbyś go na znak i używałbyś go zamiast niego. Działa również na odwrót. Inną rzeczą, którą sobie przypomniałem, jest to, że literały znaków C miały typ 'int', a nie' char'. Zapominam, że C miał wtedy w ogóle 'char', ale nawet mając go, coś takiego jak' tolower' musiałoby najpierw przekonwertować literał znaków na 'char'. – chris

Powiązane problemy