Problem bei Cäsar Chiffre



  • Guten Tag,

    Im Rahmen meiner schulischen Ausbildung zum Technischen Assistenten für Informatik, sollen wir ein Grafikprojekt mithilfe der graphics.h in DOS erstellen.
    Ich weiß die graphics.h ist nicht mehr so der Standard der Neuzeit unser Dozent besteht allerdings drauf.
    Aber mein Problem liegt eher in einer meiner Funktionen für das Thema meines Projektes, die Grafik funktioniert einwandfrei.

    Ich habe um mein Hauptprogramm nicht stark zu verändern für die Cäsarchiffre erstmal ein kleines Testprogramm geschrieben.

    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>
    #include <string.h>
    
    //Funktionsteil für Funktionen "func_versch() und func_entsch() "
    char* func_versch(char* text,char key)
    {
    	char versch[50],alpha[26]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
    	unsigned int i;
    	for(i=0;text!='\0';i++) 
    	{
    		if (text[i]==alpha[i]) 
    			{
    				versch[i]=alpha[i]+key;
    			}
    			else
    			{
    				i--;
    			}
    
    	}
    return versch;
    }
    
    //Ende des Funktionsteiles
    void main ()
    {
     char text[50],erg[50];
     char key;
     int i,laenge;
     printf("Gib ein text ein\n");
     gets(text);
     laenge=strlen (text);
     for(i=0;i<laenge;i++)
     {
      if ((text[i] >= 'a') && (text[i] <= 'z'))
        {
         text[i] = _toupper(text[i]);
        }
     }
     printf("Gib ein schluessel ein \n");
     scanf  ("%d",key);
     erg=func_versch(text,key);
     printf ("%s \n",erg);
    
    }
    

    Mein Compiler Turbo c++ 3.0 kommt mit dem Fehler "Lvalue required" bei "

    erg=func_versch(text,key);
    

    ".
    Ich versteh nur das die Lvalue die linke Konstante in dem fall erg sein müsste, die er haben will obwohl sie da ist, oder hab ich dort ein Denkfehler?

    Bin leider nicht sehr gut in C, mir liegt eher der Netzwerkbereich, daher bin ich mir auch nicht ganz im klaren ob mein Programm die Verschlüsselung so umsetzt wie ich es mir gedacht habe.
    Entschlüsselung ist noch nicht drinne da ich erstmal nur Verschlüsselung haben möchte, wenn die geht sollte die entschlüsselung ja nur umgekehrt laufen.

    Würde mich über Hilfe sehr freuen, danke.
    Wünsche einen schönen Samstag Abend!



  • Der Compiler Fehler kommt daher, dass du versuchst auf die adresse vom array einen neue addresse zu zuweisen.

    Arrays sind zwar ähnlich wie pointer, allerdings sind array konstante zeiger!
    Das heißt es kann keinen neu adresse zugewissen werden



  • Und übrigens, S T A N D A R T lässt sich nicht so schreiben, weil es Standard ist.



  • Ich habe den Quellcode soweit angepasst.
    Allerdings solltest du dir die Funktion zum Chiffrieren nochmals genauer überlegen

    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>
    #include <string.h>
    
    char* func_versch(char* text,char key, char* versch_erg)
    {
    	//solltest du dir vielleicht noch einmal genauer überlegen
            return versch_erg; //liefert falls nötig den zeiger zurück
    }
    
    //Ende des Funktionsteiles
    void main ()
    {
     char text[50];
     char erg[50];
     char key;
     int i,laenge;
     printf("Gib ein text ein\n");
     gets(text);
    
     strupr(text); //jaaa! dafür gibts bereits eine Bibliotheks funktion
    
     printf("Gib ein schluessel ein \n");
     scanf("%d", &key);
    
     func_versch(text,key, erg);
    
     printf ("%s \n",erg);
    
    }
    

    Es gibt natürlich auch die Möglichkeit, erg nur in der Chiffrier Funktion zu definieren, damit du erg nicht in der main definieren musst und somit auch nicht übergeben musst.

    Allerdings musst du dann den Modifzierer static für versch verwenden also

    char* func_versch(char* text,char key)
    {
        static versch[50];
    
    //...
    
        return versch;
    }
    


  • Danke erstmal für den Tipp, hab mir das mit den Arrays und Pointern nochmal angeguckt, mein Ergebnis sah ähnlich aus wie deines.
    Mit dem Cäserverfahren hast du recht, das muss ich mir nochmal durch den Kopf gehen lassen.
    Bei mir wurde nämlich gar nichts ausgegeben, Programm hat sich aufgehangen.



  • Hab mir das Chiffier Verfahren näher angeschaut.
    Das ist dabei herausgekommen

    char* func_versch(char* text,int key, char* versch_erg)
    {
       int i;
       int versch;
       strcpy(versch_erg, text);
    
       for(i=0; text[i] != 0; i++)
       {
    
       	if( isalpha( text[i] ) )
          {
             for(versch = key; !(versch_erg[i] + versch  <= 'Z') ; versch -= 26);
    
          	versch_erg[i] += versch;
          }
       }
    
    	return versch_erg;
    }
    

    Ich hoffe es ist richtig. 😃



  • Danke nochmal für deine Hilfe 👍
    Hab mir dein Code mal angeschaut und auch teils verstanden, mir ist nur noch nicht ganz klar was isalpha bewirkt.

    Dennoch hab ich das Programm etwas erweiterer und Funktioniert auch einwandfrei.
    Hab die Ergebnisse der Verschlüsselung und Entschlüsselung auf Internetseiten geprüft.

    So siehts aus:

    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>
    #include <string.h>
    
    char* func_versch(char* text,int key, char* versch_erg)
    {
       int i;
       int versch;
       strcpy(versch_erg, text);
    
       for(i=0; text[i] != 0; i++)
       {
    
           if( isalpha( text[i] ) )
          {
    	 for(versch = key; !(versch_erg[i] + versch  <= 'Z') ; versch -= 26);
    
    	  versch_erg[i] += versch;
          }
       }
    
        return versch_erg;
    }
    
    char* func_entsch(char* text,int key, char* entsch_erg)
    {
       int i;
       int entsch;
       strcpy(entsch_erg, text);
    
       for(i=0; text[i] != 0; i++)
       {
    
           if( isalpha( text[i] ) )
          {
    	 for(entsch = key; !(entsch_erg[i] - entsch  <= 'Z') ; entsch += 26);
    
    	  entsch_erg[i] -= entsch;
          }
       }
    
        return entsch_erg;
    } 	
    
    //Ende des Funktionsteiles
    void main ()
    {
     char text[50];
     char erg[50];
     char key;
     int i,laenge,auswahl;
    
      printf("Gib ein text ein\n");
      gets(text);
      strupr(text);
      printf("Fuer Verschluesseln 1 / Fuer Entschluesseln 2 / Beenden 3\n");
      scanf ("%d",auswahl);
     switch(auswahl)
      {
    	case 1: printf("Gib ein schluessel ein \n");
    	    scanf("%d", &key);
    			func_versch(text,key, erg);
    			break;
    	case 2: printf("Gib ein schluessel ein \n");
    	    scanf("%d", &key);
    			func_entsch(text,key, erg);
    			break;
    	case 3: printf("Ende\n");
    			break;
    	default : printf("Falsche eingabe\n");
    			break;
    
       }
     printf ("%s \n",erg);
    
    }
    

    !!! EDIT !!!

    Bei Mehreren Wötern nebeneinaner scheint das Entschlüsseln nicht ganz zu klappen, so wird aus KDOOR ZHOW , HALLO QELT.
    !!! EDIT 2 !!!
    Hab den Fehler gefunden

    for(entsch = key; !(entsch_erg[i] - entsch  <= 'Z') ; entsch += 26);
    

    Die for muss so aussehen , einfache umkehr der versch funktion, somit hab ich das jetzt auch verstanden.

    Danke nochmal für die Hilfe



  • Hilfe schrieb:

    Syntax:

    #include <ctype.h>
    int isalpha(int c);
    

    Beschreibung:

    Testet, ob ein Zeichen ein Buchstabe ist.
    isalpha prüft das als Integer übergebene ASCII-Zeichen anhand einer Tabelle.

    Rückgabewert:

    isalpha liefert einen Wert ungleich Null zurück, wenn c ein Buchstabe ist.

    Eigentlich sollte bei deiner IDE eine Hifle dabei sein!


Anmelden zum Antworten