Probleme mit gets();

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit gets();

    Hallo,
    länger her, aber da bin ich mal wieder.
    Ich habe dieses Programm für die Uni geschrieben, dass im Großen und Ganzen auch Funktioniert.
    Ich habe jetzt allerdings das Problem, dass die große while Schleife beim ersten Durchlauf einwandfrei läuft, beim zweiten Durchlauf, aber kein String mehr über gets eingelesen wird.
    Das Programm verhält sich dann so, als ob das gets() dort gar nicht stünde.

    Ist das normal für gets(); oder kann ich diesen Fehler irgendwie umgehen?

    Danke im Voraus


    Hier spendiere ich mal den Code:




    #include <stdio.h>
    #include <string.h>
    #define length 160

    int StringLaenge(char *szString)
    { int i=0, ia='a';
    while(ia!=0) // Ermittlung der Länge des Strings
    {ia= szString;
    i++;
    }
    --i;
    return i;
    }



    int StringPruefung (char *szString, int i)
    { int ib=0;
    for(ib=0; ib<i; ib++) //Eingabekontrolle
    { if((szString[ib]>=32)&&(szString[ib]<=126))
    ib++;

    else
    {
    printf("\nFalsche Eingabe, Programm wurde beendet.\n");
    return 0;
    }
    }
    }



    void Einlesen (char *szString)
    {
    gets(szString);

    }



    void Ausgabe(char *szString, char cWahl)
    {switch(cWahl)
    {case '1': {
    printf("\nDer verschlüsselte Text ist: %s\n", szString);
    }
    break;
    case'2': {
    printf("\nDer dechiffrierte Text lautet: %s\n", szString); }
    break;

    }
    }



    char Verschluesseln (char *szString,int i, int ikey)
    {int ic=0, ivar=0;
    for(ic=0; ic<i; ic++)
    {ivar = szString[ic];
    if(ivar<127-ikey)
    szString[ic] = ivar+ikey;
    else
    szString[ic] =ivar-94+ikey;

    }
    return szString[ic];
    }


    int Entschluesseln (char *szString, int i, int ikey)
    {int id=0, ivar2=0;
    for(id=0; id<i; id++)
    {ivar2 = szString[id];
    if(ivar2>=32+ikey)
    szString[id] = ivar2-ikey;
    else
    szString[id] =ivar2+94-ikey;

    }
    return szString[id];
    }

    int Verdrehen(char *szString,int i)
    {int izahl, ivar;
    char szString2[i-1];
    for(izahl=0; izahl<i; izahl++)
    {ivar= szString[izahl];
    szString2[i-izahl-1]=ivar;
    }
    return szString2[izahl];
    }




    int main ()
    {
    int i=0, ikey=0,itest=3;
    char szString[length], ca, szCopy[length];

    while(itest!=0)
    {
    printf("\nBitte einen Text eingeben mit max. 160 Zeichen, 'exit' um zu beenden.\n");

    gets(szString);

    itest=strncmp(szString, "exit",4);//test um zu beenden
    if(itest==0)
    {printf("Gefechtsfuehrung beendet.");
    return 0;}

    i=StringLaenge(szString);
    printf("\n\n%d", i);


    if (StringPruefung(szString, i)==0)
    {printf("Ätsch!");
    return 0;}


    printf("\nWählen sie einen Schlüssel zur bearbeitung der Eingabe. Wert <= 94\n"); //Schlüssel Eingabe und Kontrolle
    scanf("%d", &ikey);
    if ((ikey>94)||(ikey<1))
    {
    printf("\nFalsche Eingabe, Programm wurde beendet.\n");
    return 0;
    }

    printf("Um zu verschlüsseln drücken sie die eins,\num zu dechiffrieren die 2,\num zu beenden die drei\n");
    scanf(" %c", &ca);


    switch(ca)
    { case '1': {
    Verschluesseln (szString, i, ikey);
    }

    break;

    case '2' : {
    Entschluesseln(szString, i, ikey);

    }

    break;

    case '3' : return 0;
    break;

    default: { printf("Sie haben einen falschen Wert eingegeben.\nBitte starten Sie das Programm erneut.\n");
    return 0;
    }
    break;

    }
    strcpy(szCopy,szString);
    Verdrehen(szCopy, i);

    Ausgabe(szCopy,ca);

    }


    }
  • Hallo KingLoui,

    füge mal nach jedem scanf(...); ein getchar(); ein. Bei mir läuft es dann. Meine Vermutung ist, daß vom scanf noch ein '\n' im Tastaturpuffer bleibt, der beim nächsten gets dafür sorgt, daß diese Eingabe gleich beendet wird. Es könnte auch eins dieser Windows-Konsolenprobleme sein, falls du Windows benutzt. Hab grad kein Linux zur Hand, sonst hätt ich es da mal ohne die getchars getestet.


    Viele Grüße,

    Siracusa


    PS: Benutze doch bitte beim nächsten Mal die Code-Tags (der Code-Knopf über dem Eingabefenster) zum Formatieren des Quellcodes, dann wird das ganze viel übersichtlicher.