online 1
gast (50)

/ Forum / Anwendungen(Java,C++...)

Anwendungen(Java,C++...)Anwendungen(Java,C++...)

Fragevon mrt181 vom 29.08.2019, 20:03 Options

Problem mit do-while in C

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 schreiben

Antwort 1 von disco vom 30.08.2019, 14:46 Options

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 vom 30.08.2019, 14:53 Options

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 vom 12.09.2019, 16:38 Options

würd ja mal mit

int eingabe = 0;

"eingabe" initialisieren, da eingabe sonst einen Zufallswert besitzt.

Antwort 4 von Kai vom 12.09.2019, 16:47 Options

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 vom 12.09.2019, 16:58 Options

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.

Ähnliche Themen

Variable Variabeln Excel VBA (Summen)
sev__  16.02.2007 - 128 Hits - 1 Antwort

problem mit include - error ?
streezer  01.11.2007 - 86 Hits - 3 Antworten

ERROR: mysql_fetch_array
tAsKi  12.01.2008 - 93 Hits - 2 Antworten

Win Fixer
engel07  26.03.2008 - 21 Hits - 2 Antworten

Laufzeitfehler 1004
igrimm  29.04.2008 - 58 Hits - 5 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026