[C++] Bryta en while-sats via cin?
- 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?
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
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.
-
- 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?
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);
}
}
Re: [C++] Bryta en while-sats via cin?
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:
Sen kan man omvandla till int med atoi() om man vill
Kod: Markera allt
char c;
do {
cin >> c;
cout << "Du skrev " << c;
} while (c != 'q');
- 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?
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
Ä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.
- 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?
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.
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.
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;
}
- 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?
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.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.
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.
- 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?
Nu har jag hunnit läsa lite i Stroustrups bok, och kan korrigera mitt inlägg.
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.
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.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.
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.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 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.
- 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?
Nej, jag märkte det!!!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.
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.