Caesar Code Problem (C)

Hallo miteinander,

ich habe eine Frage bezüglich eines Teils von meinem Algorithmus, welchen ich erstellt habe um einen Text zu ver- bzw. entschlüsseln.
Es handelt sich vermutlich um einen Teil der for-Schleife?
jeder buchstabe soll um einen wert k verändert werden. also bei k=2, wird aus a dann c. das funktioniert auch, allerdings haben wir in der ausgabedatei (.txt) dann das c 15 mal hintereinander ausgegeben, obwohl eigentlich nur eins da stehen soll. Könntet ihr mir vielleicht sagen woran das liegt?

Danke im Vorraus!!
 
Zuletzt bearbeitet:
Hey,

Da meine Glaskugel leider in Reperatur ist (und ich deswegen auch nicht vorhersehen kann, wann sie wieder kommt)
wäre es ganz hilfreich, wenn du uns den Quellcode zur Verfügung stellen würdest.
Keine Angst, wir klauen schon nix =p
 
:D Joa ein bischen ausführlicher hätte meine Problemschilderung schon sein können !
Also das Problem, welches ich zuvor hatte besteht nicht mehr, aber in meinem Programm läuft trotzdem noch nicht alles...
Das hier war der Anfangsquellcode den ich gefunden hatte, allerdings besteht dieser am Ende aus vielen If/Else Schleifen und das soll nicht Sinn der Sache sein, da ich mit Strings und for-Schleifen arbeiten möchte:
Code:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <StdAfx.h>


FILE *lesen, *schreiben;
char dateiname_eingabe[256], dateiname_ausgabe[256];
char zeichen;
int schluessel;

int main()
{
    int lauf=0;

    printf("\n\tProgramm zum (de)chiffrieren von Textdateien");
    printf("\n\t____________________________________________\n\n");

    while(lauf==0)
    {
        printf("\nInputdatei: ");
        scanf("%s",&dateiname_eingabe);

        lesen=fopen(dateiname_eingabe,"r");

        if(lesen==0)
            printf("\nFehler beim Oeffnen der Datei!");


        else
            lauf=1;
    }
    lauf=0;

    while(lauf==0)
    {
        printf("\nOutputdatei: ");
        scanf("%s",&dateiname_ausgabe);

        schreiben=fopen(dateiname_ausgabe,"w");

        if(schreiben==0)
            printf("\nFehler beim Erstellen der Datei!");

        else
            lauf=1;
    }
    lauf=0;

    while(lauf==0)
    {
        printf("\nSchluessel (zum dechiffrieren negativen Schluessel angeben): ");
        scanf("%i",&schluessel);

        if((schluessel<-25)||(schluessel>25))
            printf("\nBitte geben Sie einen Schluessel im Bereich von -25 bis 25 an!");

        else
            lauf=1;
    }
    lauf=0;

    while(zeichen!=EOF)
    {
        zeichen=fgetc(lesen);

        //Zahlen
        if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)<58)&&((zeichen+schluessel)>47))
            fputc(zeichen+schluessel, schreiben);

        else if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)>57))
            fputc(zeichen+schluessel+47-57, schreiben);

        else if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)<48))
            fputc(zeichen+schluessel-47+57, schreiben);

        //Grossbuchstaben
        else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)<91)&&((zeichen+schluessel)>64))
            fputc(zeichen+schluessel, schreiben);

        else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)>90))
            fputc(zeichen+schluessel+64-90, schreiben);

        else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)<65))
            fputc(zeichen+schluessel-64+90, schreiben);

        //Kleinbuchstaben
        else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)<123)&&((zeichen+schluessel)>96))
            fputc(zeichen+schluessel, schreiben);

        else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)>122))
            fputc(zeichen+schluessel+96-122, schreiben);

        else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)<97))
            fputc(zeichen+schluessel-96+122, schreiben);

        //sonstige Zeichen
        else
            fputc(zeichen, schreiben);
    }

    fclose(lesen);
    fclose(schreiben);
[/I]

Soweit bin ich dann mit dem Umschreiben und es läuft noch nicht so ganz wie ichs hätte:

[I]

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


FILE *lesen, *schreiben;
char dateiname_eingabe[256], dateiname_ausgabe[256];
char zeichen;
int schluessel,i,laenge;

int main()
{
    int lauf=0;

    printf("\n\tProgramm zum (de)chiffrieren von Textdateien");
    printf("\n\t____________________________________________\n\n");

    while(lauf==0)
    {
        printf("\nInputdatei: ");
        scanf("%s",&dateiname_eingabe);

        lesen=fopen(dateiname_eingabe,"r");

        if(lesen==NULL)
            printf("\nFehler beim Oeffnen der Datei!");


        else
            lauf=1;
    }
    lauf=0;

    while(lauf==0)
    {
        printf("\nOutputdatei: ");
        scanf("%s",&dateiname_ausgabe);

        schreiben=fopen(dateiname_ausgabe,"w");

        if(schreiben==NULL)
            printf("\nFehler beim Erstellen der Datei!");

        else
            lauf=1;
    }
    lauf=0;

    while(lauf==0)
    {
        printf("\nSchluessel (zum dechiffrieren negativen Schluessel angeben): ");
        scanf("%i",&schluessel);

        if((schluessel<-25)||(schluessel>25))
            printf("\nBitte geben Sie einen Schluessel im Bereich von -25 bis 25 an!");

        else
            lauf=1;
    }
    lauf=0;

    while(zeichen!=EOF)
    {     
        zeichen=fgetc(lesen);

        for (i=laenge; i=0; i++){
        if(dateiname_eingabe[i]=='z' || dateiname_eingabe[i]=='Z'){
            dateiname_eingabe[i] = 'A';
            dateiname_eingabe[i] = dateiname_eingabe[i]-1;
            
        }
        dateiname_ausgabe[i]=dateiname_eingabe[i]+schluessel;
        fputc(dateiname_ausgabe[i],schreiben);
        
            
    }
}
    fclose(lesen);
    fclose(schreiben);
}


Habt ihr vielleicht ein paar Verbesserungsvorschläge?
 
Zuletzt bearbeitet von einem Moderator:
Du solltest den Quellcode in Code-Tags einbetten, dann geht die Formatierung nicht verloren und wir haben es wesentlich leichter ;)

Code:
#include "stdafx.h"

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


FILE *lesen, *schreiben;
char dateiname_eingabe[256], dateiname_ausgabe[256];
char zeichen;
int schluessel, i, laenge;

int main()
{
    int lauf = 0;

    printf( "\n\tProgramm zum (de)chiffrieren von Textdateien" );
    printf( "\n\t____________________________________________\n\n" );

    while( lauf == 0)
    {
        printf( "\nInputdatei: " );
        scanf( "%s", &dateiname_eingabe );

        lesen = fopen( dateiname_eingabe, "r" );

        if( lesen == NULL )
        {
            printf( "\nFehler beim Oeffnen der Datei!" );
        }
        else
        {
            lauf = 1;
        }
    }

    lauf = 0;

    while( lauf == 0 )
    {
        printf( "\nOutputdatei: " );
        scanf( "%s", &dateiname_ausgabe );

        schreiben = fopen( dateiname_ausgabe, "w" );

        if( schreiben == NULL )
        {
            printf( "\nFehler beim Erstellen der Datei!" );
        }
        else
        {
            lauf = 1;
        }
    }

    lauf=0;

    while( lauf == 0 )
    {
        printf( "\nSchluessel (zum dechiffrieren negativen Schluessel angeben): " );
        scanf( "%i", &schluessel );

        if( (schluessel < -25) || (25 < schluessel) )
        {
            printf("\nBitte geben Sie einen Schluessel im Bereich von -25 bis 25 an!");
        }
        else
        {
            lauf = 1;
        }
    }

    lauf = 0;

    while( zeichen != EOF )
    {
        zeichen = fgetc( lesen );

        for ( i=laenge; i=0; i++ )
        {
            if( dateiname_eingabe[i] == 'z' || dateiname_eingabe[i] == 'Z' )
            {
                dateiname_eingabe[i] = 'A';
                dateiname_eingabe[i] = dateiname_eingabe[i] - 1;
            }

            dateiname_ausgabe[i] = dateiname_eingabe[i] + schluessel;

            fputc( dateiname_ausgabe, schreiben );
        }
    }

    fclose( lesen );
    fclose( schreiben );
}

Zu deinem Problem:


  • zeichen wird nicht initialisiert. Das solltest du dir direkt angewöhnen: Variablen vor der Verwendung immer zu initialisieren. Erspart dir später merkwürdige Fehler, die man ewig sucht.
  • Du arbeitest in deiner Schleife auf den Dateinamen der Eingabe- und Ausgabedateien und nicht auf dem Zeichen, dass du aus der Datei gelesen hast.
  • Deine for-Schleife fängt bei laenge an, aber die Variable ist genauso uninitialisiert.
  • Die Schleife wird nie ausgeführt, weil du als Bedingung i=0 verwendest. Das ist eine Zuweisung und an der Stelle also komplett falsch.
  • Du prüfst nicht wirklich auf Überläufe und auch nicht auf Sonderzeichen.
Das müsste in etwa so aussehen:

Code:
do
{
  zeichen = fgetc( lesen );
  
  if( zeichen >= 'a' && zeichen <= 'z' )
  {
    zeichen += schluessel;
  }
  
  if( 'z' < zeichen )
  {
    zeichen -= 'z' - 'a';
  }
  
  if( zeichen < 'a' )
  {
    zeichen += 'z' - 'a';
  }
  
  fputc( zeichen, schreiben );
} while ( zeichen != EOF );
 
Viel einfacher ist es mit modulo Rechnung:

Mach ein Array mit den Zeichen {'a', 'b', ..., 'z'}

und rechne dann mit Array[(zeichen+schlüssel)%26]

//edit: Du willst ja auch Sonderzeichen und Zahlen ver-und entschlüsseln, demzufolge müsstest du die Zahlen+Sonderzeichen noch zum Array hinzufügen und das ganze dann Modulo der Anzahl der Elemente im Array rechnen.
 
Zuletzt bearbeitet:
Zurück
Oben