PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit gets(array-variable) in C



pete1612
10.04.2012, 10:45
Hallo Leute,

habe leider ein kleines Problem, an dem ich seit längerer Zeit kaue:
Ich beschäftige mich seit einigen Wochen mit der C-Programmierung und gestern habe ich festgestellt, dass die Funktion gets(xxxx) in meinem Programm einfach übersprungen wird.
Hab leider gerade das orginale Programm nicht auf dem PC, also hier ein Schema.

.
int main(){
char posname[20];
int pos;
.
.
printf("Bitte Pos.-Nummer eingeben >'0' beendet Programm< >'100' um neue Poition einzugeben<");
scanf("%i",&pos);pos--;
if(pos<7){
show(position[pos].parameter); *\hier wird eine Struktur angesprochen\*
printf("\nPosition %i wird angezeigt!",pos);
}
else{
switch(pos){
case -1: printf("Programm wird beendet!");break;
case 99: printf("Neue Position wird erstellt!");gets(posname);
}
}
}

Mir ist klar, dass dieses Programm so keine Funktion hat, allerdings geht es mir darum, wieso gets() hier einfach übersprungen wird.
Die Verzweigung von gets() entspricht dem Original-Programm in dem gets() ebenfalls in einer else-Verzweigung nach einer switch/case entscheidung steht.
Schreibt man gets() außerhalb dieser Verzweigungen, dann wird es abgearbeitet.
Da ich es aber gerne in dieser Struktur anwende möchte, komme ich nicht weiter...

Jemand eine Idee vielleicht??
Vielen Dank im Vorraus!!

Gruß

danimath
10.04.2012, 11:42
Moin,

sieht so aus, als ob Du im scanf nicht das abschließende '\n' abholst. Also entweder:


scanf ("%i\n", &pos);

oder:

scanf ersetzen durch:


gets (dummy);
pos = atoi (dummy);

wobei Du "dummy" vorher definierst:


char dummy [20];
(oder so).

(Und mit code-Tags wäre Dein Post besser zu lesen ;))

viele Grüße
Andreas

Torrentula
10.04.2012, 12:05
Außerdem fehlt hier:


case 99: printf("Neue Position wird erstellt!");gets(posname);

das break;

danimath
10.04.2012, 12:19
Erbsenzählen & Klugsch... ein:

Das hätte an der Stelle aber keine Funktion

Erbsenzählen & Klugsch... aus
;);););)

Edit: Wegen guten Stils hast Du natürlich Recht - spätestens wenn man einen default-Zweig braucht und dann das break vergisst, bekommt man die wunderlichsten Resultate.

Torrentula
10.04.2012, 12:32
Erbsenzählen & Klugsch... ein:

Das hätte an der Stelle aber keine Funktion

Erbsenzählen & Klugsch... aus
:wink::wink::wink::wink:


ich konnte nicht widerstehen :P

pete1612
10.04.2012, 22:07
Danke Leute für Eure Hilfe!!!!

Hab die Lösung meines Problems gefunden...Konnte es aber leider noch nicht testen. =(
Hatte die Vorschläge von Euch ausprobiert und in scanf \n zu benutzen hat leider nichts gebracht...
Dieser Lösungsvorschlag klingt gut:

Hilfe zum Thema: C-ANSI, Tastaturzeichen, Einlesen
Bekanntes Problem der C-Library
Die Ursache: die Eingabe-Funktionen von stdio.h werden alle mit ENTER vom Benutzer abgeschlossen.
Dieses ENTER-Zeichen wird nach dem Einlesen und Entfernen der eingegebenen Tastaturzeichen
nicht aus dem Eingabepuffer entfernt - es bleibt als einziges Zeichen darin zurück.
Wird nun mit gets () eine neue Eingabe vorgenommen, findet gets () im Eingabepuffer das Zeichen ENTER vor und glaubt,
die Eingabe wäre also schon abgeschlossen. Also wartet gets () nicht auf die eigentliche Eingabe,
sondern bricht diese ab und es wird die nächste Programmanweisung ausgeführt. Der Programmbenutzer hat somit den Eindruck, als würde gets () übersprungen.
Abhilfe:
vor gets den Eingabepuffer säubern mit
fflush (stdin);
Zwar ist nach der C-Library-Definition von fflush diese Funktion bei Eingabepuffern undefiniert.
Jedoch haben alle bekannten C-Libraries fflush (stdin); so programmiert,
dass dabei der Eingabepuffer gelöscht wird (d.h. alle Zeichen, die sich noch darin befinden, werden entfernt,
so auch noch das von scanf zurückgebliebene ENTER).
Hinweis:
man sollte für string-Eingaben unbedingt fgets benutzen und sowohl gets als auch scanf vermeiden;
zumal die Eingabe mit scanf beim ersten Leerzeichen abgebrochen wird.

Hoffe, dass es klappt =)

Danke für Eure schnelle Hilfe!

Gruß
Pete