- LiFePO4 Speicher Test         
Ergebnis 1 bis 6 von 6

Thema: Problem mit gets(array-variable) in C

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75

    Problem mit gets(array-variable) in C

    Anzeige

    Praxistest und DIY Projekte
    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ß

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    Moin,

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

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

    scanf ersetzen durch:

    Code:
    gets (dummy);
    pos = atoi (dummy);
    wobei Du "dummy" vorher definierst:

    Code:
    char dummy [20];
    (oder so).

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

    viele Grüße
    Andreas
    #define true ('/'/'/')
    #define false ('-'-'-')

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Außerdem fehlt hier:

    Code:
    case 99: printf("Neue Position wird erstellt!");gets(posname);
    das break;
    MfG Torrentula

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.08.2011
    Ort
    Hannover
    Beiträge
    164
    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.
    Geändert von danimath (10.04.2012 um 11:27 Uhr)
    #define true ('/'/'/')
    #define false ('-'-'-')

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Erbsenzählen & Klugsch... ein:

    Das hätte an der Stelle aber keine Funktion

    Erbsenzählen & Klugsch... aus
    ich konnte nicht widerstehen :P
    MfG Torrentula

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    09.01.2012
    Beiträge
    75
    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

Ähnliche Themen

  1. Array als variable an Funktion
    Von demmy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 11.03.2012, 22:31
  2. Problem mit Array
    Von The Man im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 31.01.2009, 17:39
  3. Variable (Array hochzählen - Wie?
    Von RogerMS im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 30.01.2007, 11:55
  4. Bytes aus einem Array in eine Word-Variable
    Von Larek im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 26.08.2006, 17:44
  5. Problem mit Array und Ports
    Von pensoffsky im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 14.08.2005, 20:00

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test