• Herzlich Willkommen!

    Nach der Schließung von inDiablo.de wurden die Inhalte und eure Accounts in dieses Forum konvertiert. Ihr könnt euch hier mit eurem alten Account weiterhin einloggen, müsst euch dafür allerdings über die "Passwort vergessen" Funktion ein neues Passwort setzen lassen.

    Solltet ihr keinen Zugriff mehr auf die mit eurem Account verknüpfte Emailadresse haben, so könnt ihr euch unter Angabe eures Accountnamens, eurer alten Emailadresse sowie eurer gewünschten neuen Emailadresse an einen Administrator wenden.

Probleme mit C++ - Programm - Es funktioniert nicht so wie ich will

Macianer

Active member
Registriert
19 Juni 2008
Beiträge
996
Punkte Reaktionen
0
Moin,

ich habe ein Problem mit einem von mir geschriebenen Programm unter C++.

Was mein Programm können soll:

Es soll einen Benutzernamen überprüfen, den der User vorher eingegeben hat. Wenn der User keine Eingabe gemacht hat, soll eine Meldung erscheinen, like: "Sie haben keine Eingabe gemacht." Um dann wieder zu der Eingabe zu springen. Und es erneut zu probieren.
Wenn nun aber der Benutzer seinen Namen eingegeben hat, dann soll eine Meldung erscheinen like: "Sie heißen: NAME DES BENUTZERS".

Was bisher funktioniert:

Der eingegebene Benutzername wird korrekt angezeigt.

Was nicht funktioniert:

Die Abfrage nach der Eingabe des Benutzernamens.

Wie mein Code bisher aussieht:

#include <iostream>


int main ()

{
char Vorname[32] = {""};
std::cout << "Bitte geben Sie ihren Vornamen ein: ";
std::cin >> Vorname;

std::cout << "Sie heißen: " << Vorname;

if(std::cin >> Vorname && "")
{

std::cout << "Sie haben nichts eingegeben";
std::cin >> Vorname;
}

else
{
std::cout << "Sie heißen: " << Vorname;
}

return 0;
}

Ich hoffe das mir jemand hier helfen kann :).

Macianer
 
Was genau heißt denn "funktioniert nicht"?

Aber was schon mal auffällt: Das da kann eigentlich nichts sinnvolles ergeben:

if(std::cin >> Vorname && "")
{

std::cout << "Sie haben nichts eingegeben";
std::cin >> Vorname;
}

Mag sein, dass der Compiler daraus irgendwas macht, aber du hast da eine Abfrage der Art

if a && b

wobei b in deinem Fall keine Bedingung enthält oder vermutlich vom Compiler als "NULL" interpretiert wird, wodurch der Ausdruck immer falsch ist. Irgendwie sowas.

Außerdem fragst du dann in der Bedingung nochmal std::cin ab, wieso?

Ganz nebenbei verhält sich std::cin manchmal nicht wie erwartet und unter Unix anders als unter Windows. Versuch es eventuell lieber mit cin.getline().


Guck doch aus Spaß mal da rein
 
Wenn du schon cin/cout verwendest solltest du gleich die string Klasse aus der STL verwenden und nicht char[]. Vor allem nicht mit einer fixen Arraylänge :)

Zum Zeit deiner if Bedingung hast du Vorname via cin ja schon eingelesen. Du sollst das nicht noch ein zweites Mal einlesen weil das ja deinen ersten Wert von "Vorname" überschreibt..

Um zu testen ob der String dann leer ist, hat die STL Stringklasse Funktionen wie empty() und length(). Siehe http://www.cppreference.com/wiki/string/start. Falls du weiterhin auf Char bestehst, wider besseres Wissen, guck mal strlen() an.
 
Zuletzt bearbeitet:
Da fehlt außerdem noch eine Schleife oder Sprungmarke.
Wenn im Programm keine Eingabe erfolgt ist, dann wird einmal mehr nach dem Namen gefragt und nichts weiteres gemacht, denn die Ausgabe steht im else-Zweig. Dieser else-Zweig wird dann nicht durchlaufen, weil die if-Bedingung erfüllt wurde.

Entweder Du machst zwei If-Konstrukte (Pseudo-Code):
If [ Eingabe == "" ]
{
erneuete Eingabe
}
If [ not Eingabe == "" ]
{
Ausgabe
}

Oder Du bastelst um dieses Konstrukt eine Schleife mit der Abbruchbedingung `Eingabe != ""`. Eine Fußgesteuerte Schleife natürlich!
 
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

void main()
{
string Benutzername ="";
neu:

cout << "Benutzernamen eingeben: ";
cin >> Benutzername;

if(Benutzername=="")
{
cout << "Es wurde kein Benutzername eingegeben !";
system("Pause");
system("Cls");
goto neu;
}
else
{
cout << "Sie heissen "+Benutzername << endl;
system("Pause");
}
}
 
Du willst ihm ernsthaft vorschlagen, in C++ goto zu verwenden? :autsch:
 
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

void main()
{
string Benutzername ="";
neu:

cout << "Benutzernamen eingeben: ";
cin >> Benutzername;

if(Benutzername=="")
{
cout << "Es wurde kein Benutzername eingegeben !";
system("Pause");
system("Cls");
goto neu;
}
else
{
cout << "Sie heissen "+Benutzername << endl;
system("Pause");
}
}

Mit deiner vorgeschlagenen Methode funktioniert es leider nicht. Ich hätte vielleicht noch erwähnen sollen, dass ich das Ganze durch die Konsole jage. Wenn ich dort meinen Benutzernamen eingebe, dann erscheint das hier:

Benutzernamen eingeben:
dd
Sie heissen dd
sh: Pause: command not found

Wenn ich allerdings nichts eingebe, dann erscheint auch keine Meldung^^.

Sehr komisch...

Vielleicht sollte ich mich erst mal mit was Leichterem beschäftigen...

Trotzdem vielen Dank für die vielen Tipps und Links :).

Macianer
 
Wenn ich allerdings nichts eingebe, dann erscheint auch keine Meldung^^.

if(Benutzername=="")
{
...
system("Cls");
}

Das dürfte ein Befehl zum löschen der Konsole sein, da soll dann auch nichts erscheinen^^
Auf welchem System lässt Du das denn laufen? Ich glaube, dass der Pause-Befehl für Windows gedacht ist. Die Fehlermeldung (sh:) lässt aber eher auf ein *nix schließen.
 
Ich lasse das Ganze auf nem Mac unter xCode laufen.
 
mhh

ja das "Cls" bedeutet "ClearScreen" damit nicht alles zugeschrieben wird. Warum die Fehlermeldung aber nicht kommt kann ich dir nicht sagen.

+ Eventuell fehlen dir da irgendwelche Bibliotheken das der damit nichts anfangen kann
 
Goto gilt als schlechter Stil und wird von den meisten Compilern als "deprecated" verwarnt. Es ist in C++ völlig überflüssig und kann bei intensiver Benutzung den Code völlig unlesbar machen. Ja, ich weiß, dass man Code auch anders unlesbar kriegt, aber mit goto geht es schneller. Sowas sollte man nicht empfehlen.

Beispiel ohne goto:

Code:
#include <iostream>
#include <string>
using namespace std;

string readInput()
{
    std::string input;
    cout << "Eingabe: ";
    getline(cin,input);
    return input;
}


void main()
{

    string Benutzername("");

    do
    {
        Benutzername = readInput();
    }
    while (Benutzername == "");

    cout << "eingegebener Name: " << Benutzername;

    // nur damit die Konsole nicht gleich wieder zu geht
    string pause;
    getline(cin,pause);

}

Dass es mit der leeren Eingabe nicht funktioniert, liegt daran, dass man mit cin leere Eingaben nicht ohne weiteres tätigen kann. Deshalb habe ich getline empfohlen/verwendet.
 
Goto gilt als schlechter Stil und wird von den meisten Compilern als "deprecated" verwarnt. Es ist in C++ völlig überflüssig und kann bei intensiver Benutzung den Code völlig unlesbar machen. Ja, ich weiß, dass man Code auch anders unlesbar kriegt, aber mit goto geht es schneller. Sowas sollte man nicht empfehlen.

Beispiel ohne goto:

Code:
#include <iostream>
#include <string>
using namespace std;

string readInput()
{
    std::string input;
    cout << "Eingabe: ";
    getline(cin,input);
    return input;
}


void main()
{

    string Benutzername("");

    do
    {
        Benutzername = readInput();
    }
    while (Benutzername == "");

    cout << "eingegebener Name: " << Benutzername;

    // nur damit die Konsole nicht gleich wieder zu geht
    string pause;
    getline(cin,pause);

}
Dass es mit der leeren Eingabe nicht funktioniert, liegt daran, dass man mit cin leere Eingaben nicht ohne weiteres tätigen kann. Deshalb habe ich getline empfohlen/verwendet.


1. Totaler Blödsinn:
Mann kann goto nicht einfach als "schlechter" stil abstempeln. Es kommt auf das programm an ob man den befehl braucht oder nicht. Wenn man natürlich immer auf die aufwendigere "tolle" lösung mit do/while oder for abzielt, ja, dan sieht goto weniger gut aus ...


2. Da haste recht, getline ist hier die Lösung !
 
Goto gilt als schlechter Stil und wird von den meisten Compilern als "deprecated" verwarnt. Es ist in C++ völlig überflüssig und kann bei intensiver Benutzung den Code völlig unlesbar machen. Ja, ich weiß, dass man Code auch anders unlesbar kriegt, aber mit goto geht es schneller. Sowas sollte man nicht empfehlen.

Beispiel ohne goto:

Code:
#include <iostream>
#include <string>
using namespace std;

string readInput()
{
    std::string input;
    cout << "Eingabe: ";
    getline(cin,input);
    return input;
}


void main()
{

    string Benutzername("");

    do
    {
        Benutzername = readInput();
    }
    while (Benutzername == "");

    cout << "eingegebener Name: " << Benutzername;

    // nur damit die Konsole nicht gleich wieder zu geht
    string pause;
    getline(cin,pause);

}

Dass es mit der leeren Eingabe nicht funktioniert, liegt daran, dass man mit cin leere Eingaben nicht ohne weiteres tätigen kann. Deshalb habe ich getline empfohlen/verwendet.


Danke :kiss:

Die Lösung funktioniert so wie ich das wollte :).

€: Vielleicht noch ne kleine Zusatzfrage: In welcher Header-Datei steht denn lowercase und uppercase? Oder wie binde ich das in mein C++-Programm ein?
 
Zuletzt bearbeitet:
1. Totaler Blödsinn:
Mann kann goto nicht einfach als "schlechter" stil abstempeln. Es kommt auf das programm an ob man den befehl braucht oder nicht. Wenn man natürlich immer auf die aufwendigere "tolle" lösung mit do/while oder for abzielt, ja, dan sieht goto weniger gut aus ...
BRAUCHEN tut man es nie. In C++ gilt es als schlechter Stil, weil es überflüssig und ggf. schwer lesbar ist. Wenn du mir nicht glaubst, such einfach mal per Google nach dem Thema. Wenn du goto im professionellen (C++-) Umfeld einsetzt, kriegst du es bei einem Code-Review um die Ohren gehauen.

Ich werde das hier nicht weiter diskutieren, soll der TE selber entscheiden, ob er es nutzen will.

/Edit: toUpper
 
Zuletzt bearbeitet:
Zurück
Oben