Hej, 1. Du använder moderna headers <iostream> etc., vilket är bra. Tyvärr släpper du upp namnrymden globalt. Lägg hellre "using namespace std" innanför main. Tackar så mycket för en informationen du delat med dig, om jag har förstått det rätt så är detta en bättre lösning? Mycket bättre, men inte bäst än. > Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :) Har tyvärr inte haft tid att testa din kod Niklas förrens idag och allt fungerar fint fram till den sista loopen <b>while(cmd != "Y" || cmd != "N"){</b>. Oavsett vad jag skriver så forstätter loopen i att fråga <b>Yes (Y) or No (N)</b>. Ändra till <b>while(cmd != "Y" && cmd != "N") {</b>En massa frågor + ett fel jag inte ser
Har nyligen börjat med C++ och har ett litet problem. Följande code fungerar fint tills man väljer att starta om det.
#include <iostream>
#include <string>
using namespace std;
#define hr "--------------------------------------------------------------------------------";
int main ()
{
//
string name;
string lastname;
string from;
string age;
string returnCMD;
start:
cout << "\t Test " << endl;
cout << "What is your firstname?" << endl;
getline(cin, name);
cout << "What is your lastname?" << endl;
getline(cin, lastname);
cout << "Where are you from?" << endl;
getline(cin, from);
cout << "How old are you?" << endl;
getline(cin, age);
cout << hr;
cout << "Firstname\t" << name << endl;
cout << "Lastname\t" << lastname << endl;
cout << "From\t\t" << from << endl;
cout << "Age\t\t" << age << endl;
cout << hr;
cout << endl << "Restart (Y) or quit the program (N)?" << endl;
invaildReturnCMD:
cin >> returnCMD;
if(returnCMD == "Y"){
system("cls");
goto start;
}
else if(returnCMD == "N"){
exit(1);
}
else{
cout << "Yes (Y) or No (N)" << endl;
goto invaildReturnCMD;
}
return 0;
}
Den skippar att fråga efter "What is your firstname" utan frågar direkt efter "What is your lastname" istället.
Övriga frågor ang variablar.
Om man vill ha en variable med a-z0-9... o.s.v alltså en sträng. Går det helt utmärkt att använda sig av <b>string from;</b> som jag har gjort, eller fungerar det bättre med char... (char, som jag inte riktigt förstår)
Tack i förhand till alla! :)
Sv: En massa frågor + ett fel jag inte ser
2. Du använder #define. Använd <b>aldrig</b> #define, utom för villkorlig kompilering. (Det finns ett fåtal användningsområden, du kommer inte stöta på något av dem på väldigt länge.)
Lägg istället en "const string hr = "---"" i main.
3. string ska alltid användas istället för char. Enda användningsområdet för char-arrayer etc. idag är för äldre kod eller API:er. I de fallen kan du konvertera string till sådana. char * är inte direkt svårt att använda, men det finns inte heller något direkt skäl till att göra det.
4. Du använder labels och goto. Gör <b>aldrig någonsin</b> det. Det kan du ha nytta av i automatgenererad kod, men inte mycket annat. Anledningen till att du inte bör göra det är att det alldeles för lätt blir rejäla fel som är svåra att hitta, och svåra att lösa. Det är det du har fått känna på nu.
Använd istället while-loopar etc.
Ditt program skulle snarare se ut som något i stil med:
int main()
{
string answer = "Y";
while(answer == "Y"){
//...
getline(cin, answer);
while(!(answer=="Y" || answer ="N")){
cout << "Y/N?";
getline(cin, answer);
}
}
Sv:En massa frågor + ett fel jag inte ser
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
const string hr = "--------------------------------------------------------------------------------";
int main ()
{
//Variablar
string name;
string lastname;
string from;
string age;
string returnCMD = "Y";
while(returnCMD == "Y"){
cout << "\t Test " << endl;
cout << "- What is your firstname?" << endl;
getline(cin, name);
cout << "- What is your lastname?" << endl;
getline(cin, lastname);
cout << "- Where are you from?" << endl;
getline(cin, from);
cout << "- How old are you?" << endl;
getline(cin, age);
cout << endl << hr;
cout << "Firstname\t" << name << endl;
cout << "Lastname\t" << lastname << endl;
cout << "From\t\t" << from << endl;
cout << "Age\t\t" << age << endl;
cout << hr;
cout << endl << "Restart (y) or quit the program (n)?" << endl;
getline(cin, returnCMD);
while(returnCMD != "Y" || returnCMD != "N"){
if(returnCMD == "Y"){
system("cls");
break;
}
else if(returnCMD == "N"){
exit(1);
}
else{
cout << "Yes (y) or No (n)" << endl;
getline(cin, returnCMD);
}
}
}
return 0;
}
Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :)
En lite fråga till denna kväll. Kan man på något sätt få t.ex. returnCMD till gemener? Typ returnCMD.tolowerstring eller något liknande?
Sv: En massa frågor + ett fel jag inte ser
Undvik att använda break eller exit om det inte är helt nödvändigt. Den yttre loopen tar hand om fallet "N". exit(1) skulle betyda att ett fel har uppstått, något som sannolikt inte är vad du vill.
system("cls") är en vanlig lösning, men den är otrevlig eftersom den inte fungerar på alla system. Frågan är om du verkligen behöver det?
Jag skulle slängt in två blankrader och nöjt mig med det. Orkar inte förklara problemet med system() just nu, återkom om du vill veta.
Vidare använder du inte windows.h, så den kan du ta bort, och raderna med namespace och konstanten ligger utanför main. Finns ingen anledning till det. Skippa också onödiga kommentarer, och använd inte versaler etc. i onödan. Min variant av koden hade istället sett ut som något i stil med:
#include <iostream>
#include <string>
int main ()
{
using namespace std;
const string hr = "--------------------------------------------------------------------------------";
string name;
string lastname;
string from;
string age;
string cmd = "Y";
while(cmd == "Y"){
cout << "\t Test " << endl;
cout << "- What is your first name?" << endl;
getline(cin, name);
cout << "- What is your last name?" << endl;
getline(cin, lastname);
cout << "- Where are you from?" << endl;
getline(cin, from);
cout << "- How old are you?" << endl;
getline(cin, age);
cout << endl << hr;
cout << "Firstname\t" << name << endl;
cout << "Lastname\t" << lastname << endl;
cout << "From\t\t" << from << endl;
cout << "Age\t\t" << age << endl;
cout << hr;
cout << endl << "Restart (y) or quit the program (n)?" << endl;
getline(cin, cmd);
while(cmd != "Y" || cmd != "N"){
cout << "Yes (y) or No (n)" << endl;
getline(cin, cmd);
}
}
return 0;
}
<b>>Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :)</b>
Precis vad jag gissade. Där ser du direkt varför du inte ska använda labels och goto.
<b>>En lite fråga till denna kväll. Kan man på något sätt få t.ex. returnCMD till gemener? Typ returnCMD.tolowerstring eller något liknande?</b>
Du använder dig av:
transform (cmd.begin(),cmd.end(), cmd.begin(), tolower);
Och se till att inkludera <algorithm>
Sv: En massa frågor + ett fel jag inte ser
Nej, buggen försvann för att du använder "getline()" istället för "cin >>".Sv:En massa frågor + ett fel jag inte ser
Vad kan var fel?Sv: En massa frågor + ett fel jag inte ser