Supportnet Computer
Planet of Tech

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

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.

Antwort 3 von Kai

würd ja mal mit

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.

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.
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.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: