Supportnet / Forum / Anwendungen(Java,C++...)
Problem mit do-while in C
Frage
Die do-while Schleife soll bei einer nicht passenden Eingabe (char statt integer) die Abfrage wiederholen. Es kommt aber zu einer endlos Schleife.
Hier der Code:
include <stdio.h>
main()
{
typedef struct //Struktur, eine benutzerdefinierter Variablentyp, wird deklariert
{
char artikel[20]; //char Typ wird Strukturvariable artikel zugewiesen
int anzahl; //int Typ wird Strukturvariable anzahl zugewiesen
float preis; //float Typ wird Strukturvariable preis zugewiesen
} lager; //durch typedef wird die Struktur als Datentyp mit dem Namen lager deklariert
lager bestand; //die Variable bestand mit dem Typ lager wird deklariert
int eingabe;
do
{
fflush (stdin); //Lösche Tastaturpuffer
printf("Artikelname eingeben: ");
eingabe = scanf("%s",&bestand.artikel);
} while (eingabe == 0);
do
{
fflush (stdin);
printf("Artikelbestand eingeben: ");
eingabe = scanf("%i",&bestand.anzahl);
} while (eingabe == 0);
do
{
fflush (stdin);
printf("Artikelpreis eingeben: ");
eingabe = scanf("%f",&bestand.preis);
} while (eingabe == 0);
}
Antwort 1 von disco
hab zwar keine ahnung von C, aber du überprüfst ja nicht den typ der eingabe, sondern den wert. so würde höchstens eine schleife erzeugt, wenn du "0" eintippst.
es gibt mehrere möglichkeiten zu prüfen, obs nen int oder ein normaler string ist. musst mal schauen was da für C in frage kommt.
beispielsweise:
den typ error abfangen (try-catch).
also der fehler der hierbei erzeugt wird: int zahl ="string";
den eingabestring mit regex prüfen.
g,
disco
es gibt mehrere möglichkeiten zu prüfen, obs nen int oder ein normaler string ist. musst mal schauen was da für C in frage kommt.
beispielsweise:
den typ error abfangen (try-catch).
also der fehler der hierbei erzeugt wird: int zahl ="string";
den eingabestring mit regex prüfen.
g,
disco
Antwort 2 von disco
achso
habe es kommt zu keiner endlosschleife gelesen.
ich weiss nicht wie sich C verhält wenn man einem int ein char zuweist. vielleicht ist das int ja dann 0 und deswegen die endlosschleife.
hier ist es dann auch egal, ob du tatsächlich eine zahl eintippst, da scanf() den wert als string ausliest. du musst also (wie angedeutet) die eingabe casten (typumwandlung) und scheuen ob es funktioniert. wenn nicht wurde kein int eingegeben.
habe es kommt zu keiner endlosschleife gelesen.
ich weiss nicht wie sich C verhält wenn man einem int ein char zuweist. vielleicht ist das int ja dann 0 und deswegen die endlosschleife.
hier ist es dann auch egal, ob du tatsächlich eine zahl eintippst, da scanf() den wert als string ausliest. du musst also (wie angedeutet) die eingabe casten (typumwandlung) und scheuen ob es funktioniert. wenn nicht wurde kein int eingegeben.
Antwort 3 von Kai
würd ja mal mit
int eingabe = 0;
"eingabe" initialisieren, da eingabe sonst einen Zufallswert besitzt.
int eingabe = 0;
"eingabe" initialisieren, da eingabe sonst einen Zufallswert besitzt.
Antwort 4 von Kai
bzw,
memset( &bestand, 0, sizeof(lager) );
int eingabe;
do
{
fflush (stdin); //Lösche Tastaturpuffer
printf("Artikelname eingeben: ");
eingabe = scanf("%s",&bestand.artikel);
} while ( strlen(bestand.artikel) == 0 );
do
{
fflush (stdin);
printf("Artikelbestand eingeben: ");
eingabe = scanf("%i",&bestand.anzahl);
} while (bestand.anzahl == 0);
do
{
fflush (stdin);
printf("Artikelpreis eingeben: ");
eingabe = scanf("%f",&bestand.preis);
} while (bestand.preis == 0.0f);
Beim Letzteren bin ich mir aber nicht mehr so sicher, weil float.
memset( &bestand, 0, sizeof(lager) );
int eingabe;
do
{
fflush (stdin); //Lösche Tastaturpuffer
printf("Artikelname eingeben: ");
eingabe = scanf("%s",&bestand.artikel);
} while ( strlen(bestand.artikel) == 0 );
do
{
fflush (stdin);
printf("Artikelbestand eingeben: ");
eingabe = scanf("%i",&bestand.anzahl);
} while (bestand.anzahl == 0);
do
{
fflush (stdin);
printf("Artikelpreis eingeben: ");
eingabe = scanf("%f",&bestand.preis);
} while (bestand.preis == 0.0f);
Beim Letzteren bin ich mir aber nicht mehr so sicher, weil float.
Antwort 5 von Supermax
Tastatureingaben mit (f)scanf abzufragen ist generell keine gute Idee, da bei Strings keine Längenüberprüfung stattfindet und daher eventuell Speicherbereiche überschrieben werden können.
Besser wäre es, alle Tastatureingaben mittels fgets() abzufragen und mit den Konvertierungsfunktionen strtol() (String-To-Long) und strtod() (String-To-Double) in den entsprechenden (long) integer- bzw. float/double Wert umzuwandeln.
fgets() erlaubt es nämlich, eine maximale Eingabelänge anzugeben, Zeichen die größer sind als der definierte Eingabepuffer werden ignoriert.
Strings können natürlich direkt mit fgets() eingelesen werden, z.B.
inp ist immer genau dann null, wenn die Schleife entweder noch nie durchlaufen wurde, oder beim Versuch von der Standardeingabe zu lesen ein EOF (End-Of-File) aufgetreten ist.
Besser wäre es, alle Tastatureingaben mittels fgets() abzufragen und mit den Konvertierungsfunktionen strtol() (String-To-Long) und strtod() (String-To-Double) in den entsprechenden (long) integer- bzw. float/double Wert umzuwandeln.
fgets() erlaubt es nämlich, eine maximale Eingabelänge anzugeben, Zeichen die größer sind als der definierte Eingabepuffer werden ignoriert.
Strings können natürlich direkt mit fgets() eingelesen werden, z.B.
char *inp = null;
while(inp == null) {
inp = fgets(bestand.artikel,sizeof(bestand.artikel),stdin);
}
inp ist immer genau dann null, wenn die Schleife entweder noch nie durchlaufen wurde, oder beim Versuch von der Standardeingabe zu lesen ein EOF (End-Of-File) aufgetreten ist.