Forum: C++, Vilken cin?

Forum huvudsida -> Programmering -> C++, Vilken cin?

Sidor: 1

Till botten

Sat4n1C 14:40 - 26:e September 2006 | Post #1
Medlem
Inlägg: 33


Skicka PM
Hej, här kommer jag igen med ännu en fråga Smiley

Men jag vet inte vilken typ av cin jag ska använda i följande kod för att jag ska kunna skriva in två ord eller flera som bil märke.

  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. struct bil
  9. {
  10. char marke[31];
  11. int ar;
  12. };
  13. cout << "Hur många bilar vill du katalogisera? ";
  14. int bilar;
  15. cin >> bilar;
  16. bil * ps = new bil [bilar];
  17. int i;
  18. for (i = 0; bilar > i; ++i)
  19. {
  20. cout << "Bil " << i + 1 << ":\n";
  21. cout << "Ange märke: ";
  22. cin >> ps[i].marke; // Vilken typ av cin??
  23. cout << "Ange tillverkningsår: ";
  24. cin >> ps[i].ar;
  25. }
  26. cout << "Här är din samling: \n";
  27. for (i = 0; bilar > i; ++i)
  28. cout << ps[i].ar << " " << ps[i].marke << endl;
  29. delete ps;
  30. cin.get();
  31. cin.get();
  32. return 0;
  33. }
  34.  


Jag vill skapa en dynamisk vektor då av bil strukturen.




Nissebosselasse 17:53 - 26:e September 2006 | Post #2
Medlem
Inlägg: 490


Skicka PM

cin.get (ps[i].marke, sizeof(ps[i].marke));

...borde fungera, om jag förstått vad du menar.

... andra sidan tycker jag du krånglar till det onödigt med en bestämd typ på märket (högst X antal bokstäver). Använd istället en std::string, så slipper du bekymra dig om sådant här.

Och behöver du av någon anledning begränsa det till X antal bokstäver, så använd en std::string ändå, men använda bara de X antal första bokstäverna (klipp bort de andra genom att använda substr).

Fler tips: du använder new [], alltså ska du använda delete [] också. Skippa detta och använd en std::vector istället. Du slipper tänka på minneshanteringen (det sköter den).

-------------------------
http://pushingcows.se
Gula Nallen



Sat4n1C 18:45 - 26:e September 2006 | Post #3
Medlem
Inlägg: 33


Skicka PM
Hm, efter "cin.get (ps[i].marke, sizeof(ps[i].marke));" så avslutades programmet redan efter frågan om hur många bilar jag vill katalogisera, och jag gör en övning i C++ - Programmering av Stephen Prata.
-vningen är såhär:

"Konstruera en struktur med namnet bil som innehåller följande information om en bil: märket som sträng i en tecken vektor eller i ett string objekt och tillverkningsåret som ett int-värde. Skriv ett program som frågar användaren om antal bilar att katalogisera. Programmet ska använda new för att skapa en dynamisk vektor med detta antal bil-strukturer. Därefter ska det fråga användaren efter märket (som kan bestå av fler än ett ord) och tillverknings året för varje struktur. Lägg märke till att det här kräver en viss omsorg, eftersom varannan uppgift är numerisk och varannan sträng. Slutligen ska programmet visa innehållet i alla strukturer."

alltså ska du använda delete [] också.


delete finns där, innan slutet, precis innan cin.get().


Senast redigerad 18:50 - 26:e September 2006


Nissebosselasse 19:39 - 26:e September 2006 | Post #4
Medlem
Inlägg: 490


Skicka PM

delete finns där, innan slutet, precis innan cin.get().

Ser du hakparanteserna? Det finns en skillnad på delete och delete []: den första använder du pekare skapade med new, den andra på vektorer skapade med new []. Du kommer inte få något kompileringsfel - däremot under programkörningen (läs mer här: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.12

Ber om ursäkt för cin.get (...), ignorera den, jag ledde in dig på villospår där. Du kan använda cin >> ... med en ändring: lägg till en cin.ignore (99, 'n'); på raden efter.


-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 19:40 - 26:e September 2006


Sat4n1C 20:12 - 26:e September 2006 | Post #5
Medlem
Inlägg: 33


Skicka PM
Jaha, så då skriver jag "delete [] ps;". Tack Smiley
Men sen så gör "cin.ignore (99, 'n');" så att det blir lite konstigt. När jag anger bil märket och sedan trycker på enter så hoppar den ner ett steg bara och visar inte nästa fråga.




Nissebosselasse 20:20 - 26:e September 2006 | Post #6
Medlem
Inlägg: 490


Skicka PM
Inte 'n', utan '\n' (märk det bakvända snedstrecket). Att föregå ett tecken med bakvänt snedstreck ("backslash") innebär att man gör en escape-sekvens, d.v.s., nästa tecken tolkas som ett typ av kommando.

EDIT: hur skulle det vara om man kunde använda sig av bakvända snedstreck i texten utan risk för att de försvinner vid varje ändring...?

-------------------------
http://pushingcows.se
Gula Nallen

Senast redigerad 20:22 - 26:e September 2006


Sat4n1C 20:30 - 26:e September 2006 | Post #7
Medlem
Inlägg: 33


Skicka PM
Aha, jag kopierade de du skrev. Tack Smiley.
Men jag undrar, i boken har man ju inte lärt sig "cin.ignore (99, 'n');" och man borde ju kunna lösa det på ett sätt som man har lärt sig ur boken, eller? Eller också har jag missat den biten XD


Senast redigerad 20:33 - 26:e September 2006


Nissebosselasse 20:35 - 26:e September 2006 | Post #8
Medlem
Inlägg: 490


Skicka PM
Nej, du har rätt, men å andra sidan visar det ju även en viktig aspekt av programmering: det finns inte bara ett sätt att lösa ett problem på.

Sedan finns det ju mer eller mindre korrekta sätt att lösa problem på, men det är en annan historia... Smiley

Finns det förresten ingen sida med lösningar till boken?

-------------------------
http://pushingcows.se
Gula Nallen



Sat4n1C 20:39 - 26:e September 2006 | Post #9
Medlem
Inlägg: 33


Skicka PM
Nej, faktiskt inte, det är därför jag skapar trådar här. Men det är ju bra när man får hjälp Smiley




Sat4n1C 20:44 - 26:e September 2006 | Post #10
Medlem
Inlägg: 33


Skicka PM
Hm, jag märkte nu att när man skriver in flera ord kommer bara första ordet fram i listan efteråt. Smiley




Sidor: 1

Forum huvudsida -> Programmering -> C++, Vilken cin?
Atom feed

Du får inte posta i den här tråden | Till toppen