Permalänk
Medlem

C++ - getline() problem

Ett konstigt problem i cpp. När jag försöker använda getline så hoppar programmet över inmatningen och går vidare. Men om jag repeterar getline två gånger i rad så fungerar det utan problem. Vad är felet och hur ordnar man det?

Koden med getline två gånger i rad

#include <iostream> #include <iomanip> #include <string> using namespace std; struct People{ string name; int phone_number; }; int main() { int numberFriends; cout << "Skriv in hur många vänner du vill mata in data för (namn och telefon-nummer)" << endl; cin >> numberFriends; People Friends[numberFriends]; for(int n = 0; n < numberFriends; n++) { cout << "Vänn "<< n+1 << endl << "Namn: "; getline(cin, Friends[n].name); getline(cin, Friends[n].name); cout << "Telefon-Nummer: "; cin >> Friends[n].phone_number; } cout << left << "Vänner" << endl << setw(10) << "Namn" << setw(10) << "Telefon-nummer" << endl; for(int n = 0; n < numberFriends; n++) { cout << setw(10) << Friends[n].name << setw(10) << Friends[n].phone_number<<endl; } return 0; }

Dold text

Edit: Har inte hittat något online om det problemet. Har samt getline för att få in för- och efternamn.
Edit2: Använder C::B med GNU GCC kompilator

Permalänk
Medlem

Har du debugat och kollat vad som händer?
Testa typ nåt sånt här:

string temp; for(int n = 0; n < numberFriends; n++) { cout << "Vänn "<< n+1 << endl << "Namn: "; getline(cin, temp); cout << temp; Friends[n].name = temp; cout << Friends[n].name; /*getline(cin, Friends[n].name); getline(cin, Friends[n].name);*/ cout << "Telefon-Nummer: "; cin >> Friends[n].phone_number; }

Nu har jag inte tillgång till att testa själv, men stegdebuga alltid och kör utskrifter om du behöver det.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Hedersmedlem
Skrivet av SpyTec:

Vad är felet och hur ordnar man det?

Det beror typiskt på att till exempel

cin >> numberFriends;

lämnar en radbrytning som getline() sedan glatt hittar. Standardlösningen är att köra

cin.ignore(10, '\n');

(som hoppar över (max 10) tecken tills en radbrytning påträffas) eller liknande före getline().

Permalänk
Medlem
Skrivet av Elgot:

Det beror typiskt på att till exempel

cin >> numberFriends;

lämnar en radbrytning som getline() sedan glatt hittar. Standardlösningen är att köra

cin.ignore(10, '\n');

(som hoppar över (max 10) tecken tills en radbrytning påträffas) eller liknande före getline().

Det måste gå att flusha stdin i C++? Jag är alltså ute efter en generisk lösning som inte beror på tidigare input-data (vilket känns väldigt knackigt)

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem
Skrivet av Elgot:

Det beror typiskt på att till exempel

cin >> numberFriends;

lämnar en radbrytning som getline() sedan glatt hittar. Standardlösningen är att köra

cin.ignore(10, '\n');

(som hoppar över (max 10) tecken tills en radbrytning påträffas) eller liknande före getline().

Hur menar du?
Efter att ha lagt till cin.ignore fungerar koden. Men du menar då på att i

cin >> numberFriends;

så lämnas det alltid ett radbryte som getline tar upp. Just varför blir det en radbrytning efter en vanlig cin?

Permalänk
Hedersmedlem
Skrivet av SpyTec:

Just varför blir det en radbrytning efter en vanlig cin?

För att man vanligen avslutar inmatningen med enter.

Permalänk
Medlem
Skrivet av Elgot:

För att man vanligen avslutar inmatningen med enter.

Ja men hur kommer det sig att getline kan fånga upp radbrytningen?

Permalänk
Hedersmedlem
Skrivet av SpyTec:

Ja men hur kommer det sig att getline kan fånga upp radbrytningen?

Ett ganska tråkigt svar är "för att den fungerar så". Tanken med getline är ju att läsa hela rader medan cin>> inte läser mer än ett element och lämnar resten.

Permalänk
Medlem
Skrivet av Elgot:

Ett ganska tråkigt svar är "för att den fungerar så". Tanken med getline är ju att läsa hela rader medan cin>> inte läser mer än ett element och lämnar resten.

Så cin för sig själv lämnar allt efter första ordet och lämnar resten till nästa inmatning. Om man inte har något som säger åt inmatningen att ignorera resten på nått sätt.
Men men, tack för svaren! Tror jag kan lite mer om cpp nu.

Permalänk
Hedersmedlem
Skrivet av SpyTec:

Så cin för sig själv lämnar allt efter första ordet och lämnar resten till nästa inmatning.

cin>> själv hoppar ju också över vita tecken vid behov, så vid flera sådana efter varandra uppstår inte dessa problem. getline särbehandlar ju dock radbrytningar.