[C++] Bryta en while-sats via cin?

Här diskuteras programmering och utveckling
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

[C++] Bryta en while-sats via cin?

Inlägg av SlamsornasKung »

Hej!

Har googlat mig blå i ansiktet och försökt med nästlade if-satser och f*n och hans mamma, men jag får inte till detta. Vad jag vill uppnå är (något som borde vara tämligen enkelt!):

· Att ett program avbryts när användaren matar in till exempel "q" och trycker på ENTER.

Men, jag stöter på patrull direkt. Till exempel; säg att mitt program går ut på att mata in integers (heltal) via cin, detta vill jag ska ske i en while-loop. Jag vill då att denna loop ska avbrytas när användaren skriver just "q" (för quit) och trycker ENTER. Då blir det fel i kompilatorn på grund av att jag tydligen inte får blanda vad som ska läsas via cin (jag får alltså inte ha både int och char som inmatning). Det här kanske låter obegripligt, jag slänger ihop lite ”slaskkod” här nedan för att tydliggöra:

main ()
{
int tal;
char quit[2] = "q";

cout << "Skriv något: ";
while (cin >> tal)
{
cout << "Du skrev " << tal;
if (tal == "q") // Det här funkar inte
break; // ...det är bara för att visa vad jag VILL göra, typ!!!
}
}


Jag kan för mitt liv inte förstå att denna operation ska behöva vara så ouppnåelig, har för mig att jag fick till det, och att det var betydligt enklare att genomföra i bash, men det kan vara ett fantasifoster från min sida.

Tacksam för hjälp och/eller en bra länk till exempel på kod som uppfyller mina önskemål.

Bästa hälsningar,

SK
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
reinfallt
Inlägg: 111
Blev medlem: 22 okt 2007, 16:11
OS: Kubuntu
Utgåva: 18.04 Bionic Beaver LTS
Ort: Ornäs/Sverige

Re: [C++] Bryta en while-sats via cin?

Inlägg av reinfallt »

Detta funkar. Sen vet jag inte hur bra lösningen är.

Kod: Markera allt

#include <iostream>
#include <cstdlib>

using namespace std;

int main ()
{
  int tal;
  char quit[2] = "q";
  char input[20];

  cout << "Skriv något: ";
  while (cin >> input)
  {
    cout << "Du skrev " << input;
    if (input[0] == 'q')
      break;
    
    tal = atoi(input);
  }
}
m!rage
Inlägg: 2550
Blev medlem: 28 apr 2009, 21:47
OS: Arch Linux
Ort: Lund

Re: [C++] Bryta en while-sats via cin?

Inlägg av m!rage »

Det är inte så snyggt att bryta loopar till höger och vänster och bör undvikas i den mån det går. Ett bättre sätt att lösa det i detta fallet är:

Kod: Markera allt

char c;
do {
  cin >> c;
  cout << "Du skrev " << c;
} while (c != 'q');
Sen kan man omvandla till int med atoi() om man vill
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

Re: [C++] Bryta en while-sats via cin?

Inlägg av SlamsornasKung »

Tack för era svar och synpunkter. Dessutom var det skönt att se att det faktiskt är betydligt krångligare än vad jag först trodde (SK != "totalt bäng").

Än en gång, stort tack för er input!

SK
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
Användarvisningsbild
Substrata
Inlägg: 71
Blev medlem: 13 apr 2010, 11:01
OS: Arch Linux
Utgåva: Vet inte/ingen utgåva passar

Re: [C++] Bryta en while-sats via cin?

Inlägg av Substrata »

Här läses en sträng, med avslut om den är "q", och därefter tolkas den lästa strängen om för olika typer.

Kod: Markera allt

#include <iostream>
#include <sstream>
#include <string>
.
.
.
  while (true) {
    string input;
    cin >> input;
    if (input == "q") break;
    basic_istringstream<char> t(input);
    // t >> tal;
  }
Om du vill låta en ström s läsa till flera möjliga typer så kan du lösa det sekventuellt genom att använda s.fail() efter läsning för att se om det gick bra; därefter använda s.clear() för att återställa strömmen så att du kan läsa om. Det finns säkert flera andra metoder, men jag sitter utan bokförråd för stunden.
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

Re: [C++] Bryta en while-sats via cin?

Inlägg av SlamsornasKung »

Substrata skrev: Om du vill låta en ström s läsa till flera möjliga typer så kan du lösa det sekventuellt genom att använda s.fail() efter läsning för att se om det gick bra; därefter använda s.clear() för att återställa strömmen så att du kan läsa om. Det finns säkert flera andra metoder, men jag sitter utan bokförråd för stunden.
Tack! Det där var lite över min fattningsförmåga, har precis börjat läsa in mig på C++, men jag är otroligt tacksam för all hjälp. Nu känns det i alla fall som att jag förstår mer om varför det INTE fungerade som jag ville från början.

Bästa hälsningar,

SK
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
Användarvisningsbild
Substrata
Inlägg: 71
Blev medlem: 13 apr 2010, 11:01
OS: Arch Linux
Utgåva: Vet inte/ingen utgåva passar

Re: [C++] Bryta en while-sats via cin?

Inlägg av Substrata »

Nu har jag hunnit läsa lite i Stroustrups bok, och kan korrigera mitt inlägg.
Substrata skrev: Om du vill låta en ström s läsa till flera möjliga typer så kan du lösa det sekventuellt genom att (1) använda s.fail() efter läsning för att se om det gick bra; därefter (2) använda s.clear() för att återställa strömmen så att du kan läsa om.
Det jag tänkte på var en naiv metod för att tolka given input till olika datatyper, men jag har nu inte hittat något om strömhanteringen som garanterar det andra steget ovanför. Du kan du nog i stort glömma ovastående citering.
SlamsornasKung skrev: Tack! Det där var lite över min fattningsförmåga, har precis börjat läsa in mig på C++, men jag är otroligt tacksam för all hjälp. Nu känns det i alla fall som att jag förstår mer om varför det INTE fungerade som jag ville från början.
Du försöker tolka input både som heltal och sträng. Kärnan i problemet är att du inte vet vad för typ av data programmet kommer att läsa, och C++ är statiskt typat och bollar inte snällt mellan olika datatyper som en del andra språk.

Du kan till exempel inte tolka allt som ett heltal, men du kan tolka det som en sträng. Därför kan du läsa till en sträng först, så att du sedan kan fatta beslut utifrån innehållet, före du försöker tolka det som ett heltal. En annan metod är att pröva det som ett heltal; om det skiter sig så kan du pröva det som något annat (samma metod som jag först nämnde).

Jag gillar inte den senare metoden. Det värt den extra koden för att bedöma vad för sorts data man har tillgivits före man försöker hantera det som en specifik datatyp. För att ge exempel kan det göras med regular expressions, eller med en riktig parser generator. Boost bjuder på regular expressions och andra parsningsmetoder.
Användarvisningsbild
SlamsornasKung
Inlägg: 886
Blev medlem: 27 jun 2009, 19:23
OS: Ubuntu
Utgåva: 22.04 Jammy Jellyfish LTS
Ort: 08

Re: [C++] Bryta en while-sats via cin?

Inlägg av SlamsornasKung »

Substrata skrev: Du försöker tolka input både som heltal och sträng. Kärnan i problemet är att du inte vet vad för typ av data programmet kommer att läsa, och C++ är statiskt typat och bollar inte snällt mellan olika datatyper som en del andra språk.
Nej, jag märkte det!!!

Tusen tack för ditt inlägg & bästa hälsningar,

SK
HP NC2400 - Ubuntu 10.04 • Fujitsu Siemens AmiloM7400 - Arch Linux • HP/Compaq Mini 110C - Ubuntu 10.04
CryingFreeman skrev:[…] Ubuntu är och förblir en meritokrati, inget demokratiskt experiment där alla får säga vad som helst till vem som helst, hur som helst.
Skriv svar

Återgå till "Programmering och webbdesign"