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 ); }
-
Oder so hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=39349
-
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 !
habesetvbuf ( 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).