fgets / nach Aufruf einer Funktion - abbruch!



  • Grüße 🙂
    Ich habe beschlossen für den Informatik ein
    Programm zum de und encoden von der Caesar Chiffre zu schreiben.

    Das substituieren war auch alles kein Problem.
    Dann habe ich mich entschlossen es weiter zu entwickeln
    indem ich einen Text mit leerzeichen etc. eingeben kann
    und er diese entfertn!
    Auch diese Funktion funktionierte Problemlos.

    Nun habe ich das Programm neu verfasst doch es läuft nicht mehr :p ...
    Leider funktioniert das debuggen nicht so richtig ( Pelles C IDE)
    und so weiß ich nicht genau was für ein Problem er hat.

    Ich hab einfach mal einen Testcode geschrieben
    wo ich das Menu aufrufe , dann die Auswahl ausgebe
    und dann den Klartext einlese, dort die Leerzeichen entferne
    und dann alle Buchstaben groß schreiben lasse.
    Leider bricht er nach der Ausgabe der Menuauswahl ab!

    main Code:

    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include "menu.h"
    #include "cedit.h"
    #define ZEICHEN 500
    
    void main()
    
    {
    	char chEingabetext[ZEICHEN];
    	char chOhnetext[ZEICHEN];
    	char chChiffretext[ZEICHEN];
    	int nAuswahl = 0;
    	nAuswahl = menu();
    	printf("%i\n",nAuswahl);
    
    	fgets(chEingabetext,ZEICHEN,stdin);
    	cedit(chEingabetext, chOhnetext);
    	puts(chEingabetext);
    
    }
    

    Menu Code

    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include "menu.h"
    int menu()
    {
    	int nAuswahl;
    	_clrscr();
    	printf("Dieses Programm wurde geschrieben von xx xx");
    	printf("\nIm Rahmen des Unterrichts der xx");
    	printf("\nAn der Schule xxx");
    	printf("\n\nHerzlich Willkommen zum Caesar Chiffre Programm.");
    	printf("\nMit diesem Programm koennen Sie ");
    	printf("\nVerschluesseln und Entschluesseln");
    	printf("\n\n1: Verschluesseln.");
    	printf("\n2: Entschluesseln.");
    	printf("\n3: Entschluesseln mit Hilfe eines Suchbegriffes");
    	printf("\n4: Programm beenden.");
    	printf("\n\nIhre Auswahl: ");
    	scanf("%i",&nAuswahl);
    	return nAuswahl;
    }
    

    und der Leerzeichen & Groß schreiben Code

    #include <conio.h>
    #include <stdio.h>
    #include <string.h>
    #include "cedit.h"
    #define ZEICHEN 500
    
    void cedit(char chEingabetext[ZEICHEN], char chOhnetext[ZEICHEN])
    {
    	int i = 0, zaehler = 0,j=0;
    	chOhnetext = chEingabetext;
    	for(zaehler=i=0;chOhnetext[i]!='\n';i++)
    	{
    		if(chOhnetext[i]!=' ')
    			chEingabetext[zaehler++]=chOhnetext[i];
    	}
    	j = strlen(chEingabetext);
    	chEingabetext[i-(i-zaehler)] = '\0';
    
    	for(i=0;i!=j;i++)
    	{
    		chEingabetext[i] = toupper(chEingabetext[i]);
    	}
    }
    

    Hoffe ihr könnt mir helfen woran es liegt 🙂
    Liebe Grüße!
    PS Wie gesagt er scheint gar nicht erst in die "cedit" rein zu gehen sondern
    einfach abzubrechen :<



  • 42



  • normal würd ich sagen verwend doch mal die suche aber in deinem fall hättest einfach mal die threads auf der ersten seite überfliegen müssen denn http://www.c-plusplus.net/forum/viewtopic-var-t-is-257425.html
    sollte dir eigentlich schon weiter helfen... falls nicht könntest ja trotzdem in dem post weiter schreiben 😉



  • Debugausgaben helfen.

    Sowas hier:

    #define DEBUG printf("Zeile %d\n", __LINE__)
    

    Dann kannst du mal hinter fgets, cedit und puts DEBUG; schreiben und dann siehst du genauer wo er hängt. Wenn er in cedit hängt dann kannst du cedit mit debugs füllen, zur Not in jede zweite Zeile bis du den Fehler oder zumindest die Stelle des Fehlers gefunden hast.



  • Ich bin am verzweifeln!
    Sobald ich das Menü rauslasse Funktioniert
    fgets und cedit einwandfrei!
    hab nun alles was mir so einfällt probiert!
    hab das menu nicht als unterprogramm genommen,
    es mit pointern probiert aber nichts!

    das mit dem debuggen hat geholfen , danke dafür 🙂

    nun weiß ich nur nicht warum er sobald das "menu" da ist
    fgets einfach mit '\n' füllt !



  • Das ist mal wieder das Problem des nicht geleerten Eingabepuffers. Die Funktion scanf lässt das '\n' Zeichen im Puffer drin, fgets liest es automatisch ein.
    Einfach mal den Puffer leer machen:

    void cb() { // clear buffer :) 
        setvbuf ( stdin, NULL, _IONBF, 0 ); 
        setvbuf ( stdin, NULL, _IONBF, BUFSIZ ); 
    }
    




  • Das

    int c; // int c, nicht char c.
    while ((c = getchar()) != EOF && c != '\n');
    

    hat prima funktioniert , das von dir Big Brother hat nicht so
    funktioniert ? vllt hab ich es aber auch nur falsch benutzt !
    habe

    setvbuf ( stdin, NULL, _IONBF, 0 );
        setvbuf ( stdin, NULL, _IONBF, BUFSIZ );
    

    einfach so benutzt

    void main()
    
    {
    	char chEingabetext[ZEICHEN];
    	char chOhnetext[ZEICHEN];
    	char chChiffretext[ZEICHEN];
    	int nAuswahl = 0;
    	nAuswahl = menu();
            setvbuf ( stdin, NULL, _IONBF, 0 );
            setvbuf ( stdin, NULL, _IONBF, BUFSIZ );
    	printf("%i\n",nAuswahl);
    	fgets(chEingabetext,ZEICHEN,stdin);
    	cedit(chEingabetext, chOhnetext); DEBUG;
    	puts(chEingabetext); DEBUG;
    }
    

    aber deine erklärung war besser 😉 danke dafür



  • Ist mir ein Rätsel, warum das nicht funktionieren sollte. Was für ein Betriebssystem und welchen Compiler bzw. IDE hast du?



  • Windows 7 Ultimate x64
    IDE Pelles C Version 6.00.4 (Win 64)
    bin aber gerne für neue IDE offen 😉
    Auch kostenpflichtige :p



  • Warum das bei dir nicht funzt, keine Ahnung. Es gab hier noch nie Probleme damit. Ich nehme an, der Grund ist: Es ist nicht vom Standard vorgesehen, das der Pufferinhalt gelöscht wird, wenn setvbuf aufgerufen wird.
    Die von faqqer verlinkte Variante ist ja ok, nimm die einfach.
    Man muss sich bloß bewusst sein, dass das Programm stehen bleiben kann, wenn kein '\n' und kein EOF im Eingabepuffer ist (hier also z.B. vor scanf).


Anmelden zum Antworten