PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C, abbruch einer Schleife



darxun
26-04-2008, 12:53
Was für Möglichkeiten gibt es, um die Eingabe von neuen Werten jeder Zeit abbrechen zu können? Mir fält einfach nichts richtiges ein. Jedes mal fragen ob abgebrochen werden soll ist ja auch nicht sinnvoll...

Danke schonmal!


for (ii=0; ii<=19; ii++)
{
printf("Geben Sie die Daten des %d-ten Kassenzettels ein: \nArtikel: ", ii+1);
scanf(" %s", &Akassz[ii].AcArtikel);
printf("Preis: ");
scanf(" %f", &Akassz[ii].fPreis);
printf("ID: ");
scanf(" %i", &Akassz[ii].iID);
iArtAnz=ii;
}

panzi
26-04-2008, 13:51
Bevor du ließt, prüfe auf EOF: feof(stdin)
Wenn der User die Eingabe abbrechen will kann er es mit Strg+D (Unix; unter Windows mit Strg+Z) tun. Da ist aber stdin nicht wirklich geschlossen. Du kannst einfach weiterlesen. Sprich man kann als user mehrmals EOF auf stdin signalisieren.

Andere (eventuell schönere?) Möglichkeit:
Registriere einen signalhandler für SIGINT. Der soll ein entsprechendes Flag setzen, bei dem du dann die Schleife abbrichst. Dann kann der user mit Strg+C abbrechen. Siehe: man signal

darxun
26-04-2008, 14:01
ok, danke wie würde das implementiert genau aussehen? (ich kenne mich in C nicht gut aus)

BLUESCREEN3D
26-04-2008, 15:41
Dann informier dich - du wirst jawohl wissen, wie eine Suchmaschine funktioniert (das poste ich heute zum zweiten Mal ...).

Fang mit feof() an. Das ist die einfachere Möglichkeit.
Wenn du es nicht hinkriegst, das in dein Programm einzubauen, dann poste deinen neuen Quellcode.

Blutgerinsel
26-04-2008, 21:08
Hat die Instanzierung von ii ausserhalb der Schleife einen Sinn?

for(int ii....) würde den Speicherereich nach Ablauf der Schleife wieder freigeben

jeebee
26-04-2008, 21:17
for(int ii....) würde den Speicherereich nach Ablauf der Schleife wieder freigeben
Dies ist aber nur OK wenn das Ganze C99 ist. C90 erlaubt keine Anfangsdeklaration in for-Schleifen. Über den Speicherbereich musst du dir hier eh keine Sorgen machen. ein int ist gerade mal 4 Bytes, das sollte zu verkraften sein. Abgesehen davon werden lokale Variablen meistens (IA32, AMD64, ...) auf dem Stack angelegt und werden daher beim Verlassen der entsprechenden Methode wieder freigegeben.

panzi
29-04-2008, 22:57
Dies ist aber nur OK wenn das Ganze C99 ist. C90 erlaubt keine Anfangsdeklaration in for-Schleifen. Über den Speicherbereich musst du dir hier eh keine Sorgen machen. ein int ist gerade mal 4 Bytes, das sollte zu verkraften sein. Abgesehen davon werden lokale Variablen meistens (IA32, AMD64, ...) auf dem Stack angelegt und werden daher beim Verlassen der entsprechenden Methode wieder freigegeben.
Bzw. analysieren Kompiler den Kontrollfluss und wenn zB 2 Variablen zwar in der selben Funktion deklariert werden, aber nie überlappend verwendet werden, wird nur einmal speicher angefordert. Ist ein sehr einfacher Algorithmus zur Registerallokation. Wird wohl abgewandelt sicher auch direkt für die Stackrepräsentation der Varaible verwendet (wenn eine notwendig ist).