Forum: C++, cctype

Forum huvudsida -> Programmering -> C++, cctype

Sidor: 1

Till botten

Sat4n1C 19:20 - 8:e Oktober 2006 | Post #1
Medlem
Inlägg: 33


Skicka PM
Hej, jag försöker göra ett program som läser in tangentbordsinmatning fram till tecknet @ och sen ekar den inmatningen förutom siffror och konverterar versaler till gemener och tvärt om.

  1.  
  2. #include <iostream>
  3. #include <cctype>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10. cout << "Skriv in ord, avsluta med @:\n";
  11.  
  12. char ch;
  13. string str;
  14.  
  15. while (cin.get(ch))
  16. {
  17. if (isalpha(ch) ||
  18. ch == 'å' || ch == 'ä' || ch == 'ö' ||
  19. ch == '...' || ch == ',,' || ch == '-')
  20.  
  21. {
  22.  
  23. if (isupper(ch) ||
  24. ch == '...' || ch == ',,' || ch == '-')
  25. tolower(ch);
  26.  
  27. else if (islower(ch) ||
  28. ch == 'å' || ch == 'ä' || ch == 'ö')
  29. toupper(ch);
  30. }
  31. if (ch == '@')
  32. break;
  33.  
  34. str += ch;
  35. }
  36.  
  37. cout << str;
  38.  
  39. cin.get();
  40. cin.get();
  41.  
  42. return 0;
  43. }


Vad är det jag gör som är fel?




Independence 21:03 - 8:e Oktober 2006 | Post #2
Administratör
Inlägg: 1800


Skicka PM
Vad är det som blir fel?

-------------------------

Vi är riddarna som säger fiskbulle!





Sat4n1C 21:33 - 8:e Oktober 2006 | Post #3
Medlem
Inlägg: 33


Skicka PM
Om jag skriver tex "hej 123@ hej", så ekar den bara hej 123 blixtsnabbt sen stängs den ner. Den skriver inte HEJ som den ska göra.




Lajnold 21:56 - 8:e Oktober 2006 | Post #4
Medlem
Inlägg: 65


Skicka PM
tolower/toupper ändrar inte på variabeln som skickas med, utan returnerar istället det ändrade tecknet. Du måste därför tilldela returvärdet till 'ch' om det ska bli någon ändring.

-------------------------
Ingen signatur!

Senast redigerad 21:56 - 8:e Oktober 2006


Sat4n1C 22:13 - 8:e Oktober 2006 | Post #5
Medlem
Inlägg: 33


Skicka PM
Aha, hur ser satsen ut om man tilldelar returvärdet?

EDIT: Märkte nu att jag glömde en sats i koden som förhindrar programmet att eka siffror.


Senast redigerad 22:18 - 8:e Oktober 2006


Lajnold 22:20 - 8:e Oktober 2006 | Post #6
Medlem
Inlägg: 65


Skicka PM
ch = toupper(ch);

Och motsvarande för tolower.

-------------------------
Ingen signatur!

Senast redigerad 22:20 - 8:e Oktober 2006


Sat4n1C 22:38 - 8:e Oktober 2006 | Post #7
Medlem
Inlägg: 33


Skicka PM
Okej, tack för hjälpen Smiley




Sat4n1C 22:52 - 8:e Oktober 2006 | Post #8
Medlem
Inlägg: 33


Skicka PM
Men jag undrar, varför stängs programmet bara ner om man skriver något efter '@' ?




Lajnold 23:01 - 8:e Oktober 2006 | Post #9
Medlem
Inlägg: 65


Skicka PM
Eftersom slutet av programmet nås. Därför stängs det av.

När man skriver '@' så hoppar programmet ur while-loopen, skriver ut texten, väntar på att man ska trycka enter, och stängs av. Var det inte så du ville att det ska bli?

-------------------------
Ingen signatur!



Sat4n1C 23:06 - 8:e Oktober 2006 | Post #10
Medlem
Inlägg: 33


Skicka PM
Man får aldrig chansen att trycka ner enter om man skriver något efter '@', har du testat kompilera det?




Lajnold 23:12 - 8:e Oktober 2006 | Post #11
Medlem
Inlägg: 65


Skicka PM
När jag kör programmet så väntar det på att jag ska trycka enter. Konstigt att det inte blir så för dig.

-------------------------
Ingen signatur!



Lajnold 23:16 - 8:e Oktober 2006 | Post #12
Medlem
Inlägg: 65


Skicka PM
Ah, nu förstår jag hur det är som du menar.

Ett sätt att lösa det på, som dessutom kan ses som bättre än cin.get() för att plocka bort tecken, är att istället använda cin.ignore() för att plocka bort alla tecken ut bufferten.

// ...
//rdbuf() returnerar den buffert som cin använder, och den har en funktion, in_avail(), som returnerar hur mycket som finns i bufferten. Använd detta som argument för ignore() för att slänga bort alla tecken ut bufferten.
cin.ignore(cin.rdbuf()->in_avail());
cin.get();
// ...


-------------------------
Ingen signatur!

Senast redigerad 23:19 - 8:e Oktober 2006


Sat4n1C 23:16 - 8:e Oktober 2006 | Post #13
Medlem
Inlägg: 33


Skicka PM
Fast det går fortvarande inte.


Senast redigerad 23:23 - 8:e Oktober 2006


Sidor: 1

Forum huvudsida -> Programmering -> C++, cctype
Atom feed

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