Morsecode - Decoder funktioniert nicht [war: HILFE]



  • 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;
    }
    

Anmelden zum Antworten