Morsecode - Decoder funktioniert nicht [war: HILFE]
-
Zuerst mal danke an allen für die schnellen Antworten...
@itedvo
tut mir leid klingt jetzt blöd, aber bin neu im Forum und weis ehrlich gesagt nicht was ich unter "schreib das ganze mal "schön" mit cpp tags und dann schaun wir weiter =b" verstehen soll. Was ist denn gemeint mit cpp tagsWie benutzt man dies ???
Wieso denn Zweidim. Felder??? hab ich auch nicht verstanden...
Das Problem ist ich verstehe nicht wie den Fehler beseitigen kann
-
Pasha schrieb:
... und weis ehrlich gesagt nicht was ich unter "schreib das ganze mal "schön" mit cpp tags und dann schaun wir weiter =b" verstehen soll. Was ist denn gemeint mit cpp tags
Wie benutzt man dies ???
Unter dem Editfeld hast du ja schon die Smilies gefunden.
Unter denfindest du ein Kästchen wo C/C++ drin steht.
Markiere deinen eingefügten Quelltext und drück auf das Kästchen.
Dann werden vor und nach dem Text Tags eingefügt. In diesem Fall steht dann cpp und \cpp drin. Das macht den Quellcode hübsch und bunt.Pasha schrieb:
Wieso denn Zweidim. Felder??? hab ich auch nicht verstanden...
Das Problem ist ich verstehe nicht wie den Fehler beseitigen kann
Du verstehst auch nicht was du bis jetzt tust.
Dein alphabet besteht aus Zeichen. Dein morsecode aus Strings. Das sind verschiedene Dinge.
In ein char passt ein Zeichen rein. Beim Morsecode wären das '.' oder '-'.Da du für den Morsecode mehrere Zeichen für einen Buchstaben brauchst, musst du auch mehr Zeichen einlesen.
Zeichen kann man noch mit == oder != vergleichen. Bei Strings musst du dann Funktionen benutzen. Z.B. strcmp() (string compare) oder strchr()Du musst deine MORSE2ABC() umbauen, etwa so.
Zeile einlesen. Solang noch Zeichen das sind: Zeichen != ' ' Suchen. Stelle merken Nach nächsten Leerzeichen suchen. Dazwischen ist dann ein Morsezeichen. Das kannst du dann mit deiner Liste vergleichen. Weiter mit Schleife.
Du kannst auch die Funktion strtok() benutzen.
-
Jetzt mal nur fürs einzelne Morsezeichen : zB ". " => E
char cEingabe[]={"a"}; fflush(stdin); fgets(cEingabe,3,stdin); printf("%s",cEingabe);
kann man ja einwandfrei einlesen ausgeben... Aber wenn ich dann weiterprog
if(strcmp(cEingabe, cTest) != 0); { for(i=0;i<37;i++) { if(strcmp(morsecode[i], cEingabe ) == 0) { printf("%s",alphabet[i]); } } }
bei der Umwandlung beschwert der sich. Der debugger gibt eine Fehlermeldung bei printf() "Zugriffsverletzung"... Weis jmd weiter ???
Bedenkt bitte dass ich erst seit diesem sem. programmiere,d.h. nicht zur Sau machen :p
-
könnte daran liegen das
char alphabet[] =
kein string ist du ihn aber mit %s abfragen wilst
printf("%s", alphabet[i]);
wäre glaube besser mit %c
aber das wäre nur meine bescheidene Meinung.
-
Mal ein paar Anmerkungen
char cEingabe[]={"a"}; //legt ein Array an mit [b]2[/b] Elementen //Diese sind gefüllt mit '2' und '\0' fflush(stdin); // ist [b]nicht[/b] definiert fgets(cEingabe,3,stdin); // jetzt willst du 3 Zeichen einlesen // hast aber nur für 2 Platz s.o. printf("%s",cEingabe);
Lies dir nochmal das Kapitel mit Strings durch.
Unbedingt den Unterschied zwischen "4" und '4' und 4.
Und was das '\0' ist.
-
zwar gibt der E aus aber hängt sich auf...
ein plan wie ich ganze sätze umwandeln könnte????
-
zeig nochmal deinen quellcode
ich würds so machen:
Morsezeichen(MZ) einlesen Morsezeichen in string schreiben string mit MZCodes vergleichen (strcmp oder so) wenn es keinen Treffer gibt { nächstes MZ einlesen an String anhängen string mit MZCodes vergleichen } ansonsten { ausgabe des buchstabens string löschen(leer machen, neu aufsetzten, wie auch immmer) }
-
fgets(cEingabe,leange=strlen(cEingabe),stdin);
hab es mal so versucht aba geht auch nicht... was anderes hab ich nicht finden können
char cTest[]={"t"}; char cEingabe[7]={"a"}; // int strcmp(char *cEingabe, char *cTest); fflush(stdin); fgets(cEingabe,7,stdin); // printf("%s",cEingabe); for(i=0;i<37;i++) { if(strcmp(morsecode[i], cEingabe ) == 0) { printf("%c",alphabet[i]); } }
für genau 7 Zeichenlange codes funtkionierts... Problem ist das die Morsecodes unterschiedliche längen haben
-
Evtl. ist in cEingabe noch das '\n' drin.
Mach mal printf("<%s>\n",cEingabe);
Wenn da dann<.--- >
steht ist das '\n' noch drin.
Zudem ist in deinem Array morsecode immer noch ein Leerzeichen am Ende der Morsezeichen.
-
Bin soweit eigentl fertig nur das einzige Problem ist, dass bei der Ausgabe vom Alphabet nicht getrennt wird. Hier nochmal code:
int i; const char *cMorsecode[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"," "}; const char cAlphabet[] = {'A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X', 'Y','Z','1','2','3','4','5','6','7','8','9','0',' '}; char cEingabe[256]={"a"}; fflush(stdin);gets(cEingabe); if(strchr(cEingabe, ' ')!=0) { char cTeiler[] = " "; char *pointer; pointer = strtok(cEingabe,cTeiler); while(pointer!=NULL) { for(i=0;i<37;i++) { if(strcmp(cMorsecode[i], pointer ) == 0) { printf("%c",cAlphabet[i]); } } pointer=strtok(NULL,cTeiler); } } }
kriege halt keine leerzeichen mehr zwischen den Wörtern zB: HALLOHALLO
ich weis weshalb es nicht geht aber wie kann ich es ohne viel zu ändern beseitigen???
-
strtok() fasst aufeinander folgende Trennzeichen zu einem zusammen. Wenn du da einen Unterschied machen willst, wieviele Leerzeichen zwischen den Morsefolgen standen, mußt du da sensibler vorgehen, z.B. mit strchr().
PS:
fflush(stdin);
solltest du schnell wieder vergessen.
-
strtok ist problematischen... im morsecode tauchen ja viele aufeinander folgende zeichen wie ... bzw --- auf...
und mit der strchr() werden die leerzeichen weggelassen...?????????????????????????????????????????????????????????
-
Pasha schrieb:
strtok ist problematischen... im morsecode tauchen ja viele aufeinander folgende zeichen wie ... bzw --- auf...
Die stören nicht - dein Problem ist nur, daß strtok() nicht zwischen einzelnen Leerzeichen (Trennung der Buchstaben) und mehrfachen Leerzeichen (Trennung von Wörtern) unterscheiden kann.
und mit der strchr() werden die leerzeichen weggelassen...
Wie meinen? strchr() lässt gar nichts weg, sondern sucht nur nach bestimmten Zeichen in einem String (und im Gegensatz zu strtok() lässt es die gefundenen Zeichen stehen, da müsstest du also selber '\0' einfügen, wenn du die Zeichen weiterverarbeiten willst:
char* start = cEingabe; do { char* ende = strchr(start,' '); if(ende!=NULL) *ende='\0'; ... start = ende+1; } while(ende!=NULL);
(ungetestet)
-
CStoll schrieb:
{ char* ende = strchr(start,' '); if(ende!=NULL) *ende='\0'; ... start = ende+1; } while(ende!=NULL);
(ungetestet)
Ja das merkt man. ende wird außerhalb des Sichtbarkeitsbereichs verwendet.
struct {char *morse[37],alph[37]; } codes = { {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",".----","..---","...--","....-",".....","-....","--...","---..","----.","-----"," "}, {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0',' '}}; int main() { char z[100]; while( fgets(z,100,stdin) && *z!='\n' ) { char x[100],*p=z; int n=0,i; while( i=37,1==sscanf(p+=n,"%s%n",x,&n) ) while( i-- ) if( !strcmp(x,codes.morse[i]) ) printf("\n%c",codes.alph[i]); } return 0; }