Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Caesar Code Problem (C)

Diskussion: Caesar Code Problem (C) im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo miteinander, ich habe eine Frage bezüglich eines Teils von meinem Algorithmus, welchen ich erstellt habe um einen Text ...

Antwort
Alt 19.05.11, 15:01   #1 (permalink)
 
Registriert seit: 19.05.11
degelchrizzz Leistung: Facit NTK
Likes: 0
Standard Caesar Code Problem (C)

Anzeige

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!!


Geändert von degelchrizzz (19.05.11 um 15:17 Uhr)
degelchrizzz ist offline   Mit Zitat antworten
Alt 19.05.11, 15:25   #2 (permalink)
 
Benutzerbild von ChiefWiggum
 
Registriert seit: 09.10.07
ChiefWiggum Leistung: 8086
ChiefWiggum eine Nachricht über ICQ schicken
Likes: 11
Standard

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
__________________
Be the source always with you.
ChiefWiggum ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 19.05.11, 18:24   #3 (permalink)
Themenstarter
 
Registriert seit: 19.05.11
degelchrizzz Leistung: Facit NTK
Likes: 0
Standard

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?

Geändert von CDW (19.05.11 um 20:06 Uhr) Grund: Code Tag gesetzt
degelchrizzz ist offline   Mit Zitat antworten
Alt 19.05.11, 19:48   #4 (permalink)
 
Registriert seit: 06.06.09
Thunderb0lt Leistung: 8086
Likes: 6
Standard

Du solltest den Quellcode in Code-Tags einbetten, dann geht die Formatierung nicht verloren und wir haben es wesentlich leichter

formatierter original Quellcode   

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 );
__________________
A good programmer looks both ways before crossing a one-way street.

Die Politik kann uns nur für so dumm verkaufen, wie wir sind.
Thunderb0lt ist offline   Mit Zitat antworten
Alt 19.05.11, 22:25   #5 (permalink)
 
Registriert seit: 20.07.06
Darkslide Leistung: Facit NTK
Likes: 21
Standard

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.

Geändert von Darkslide (19.05.11 um 22:40 Uhr)
Darkslide ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Caesar Code Problem (C)
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61