C Ceasar Chiffre

Teepause

Newbie
Registriert
Nov. 2019
Beiträge
4
Hallo,
Ich hab hier ein kleine Programm geschrieben in dem aus einer Datei ein text gelesen wird
und verschlüsselt, der verschlüsselte text soll dann in einer neuen text Datei rein Geschreiben werden.

FOLGENDES PROBLEM:
Mein Programm schreibt leider die verschlüsselten sachen nicht an die richtige stelle.
und es fehlt die funktion das die nachricht wieder entschlüsselt wird das heisst dass das Programm
die Buchstaben zählt und dann den abstand zwischen den häufigsten Buchstaben und dem 'e' ermittelt
und mit diesem schlüssel dann die Nachricht wieder zurück entschlüsselt.

für Lösungsvorschläge aller art wäre ich sehr dankbar da ich momentan echt auf dem schlauch stehe.
anbei is ein bild mit momentaner ausgabe und ausgabe wie es sein sollte.

Lg. Teepause.

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void caesarcipher(char *plaintext, int key){
  int i = 0;
  int cyphervalue;
  char cypher;
  FILE *fc;
    fc = fopen("encrypted.txt", "w");

  while (plaintext[i] != '\0' && strlen(plaintext) -1 > i){

    if(plaintext[i] == ' '){
      printf("%c", plaintext[i]);
      fprintf(fc, "%c", plaintext[i]);
    }else if(plaintext[i] == '.'){
       printf("%c", plaintext[i]);
       fprintf(fc, "%c", plaintext[i]);
    }else if(plaintext[i] == '!'){
      printf("%c", plaintext[i]);
      fprintf(fc, "%c", plaintext[i]);
    }else if(plaintext[i] == '?'){
      printf("%c", plaintext[i]);
      fprintf(fc, "%c", plaintext[i]);
    }else if(plaintext[i] == ','){
      printf("%c", plaintext[i]);
      fprintf(fc, "%c", plaintext[i]);
      }else{
        cyphervalue = ((int)plaintext[i] - 97 + key) % 26 + 97;

          if(cyphervalue == 92) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
          else if(cyphervalue == 91) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
          else if(cyphervalue == 93) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
          else if(cyphervalue == 94) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
          else if(cyphervalue == 95) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
          else if(cyphervalue == 96) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;

    cypher = (char)(cyphervalue);
        printf("%c", cypher);
        fprintf(fc, "%c", cypher);
    }
      i++;
  }
}
int main(){
  int d;
  int key;
  FILE *fc;
  fc = fopen("encrypted.txt", "w");

  printf("Schluessel: ");
  fprintf(fc, "Schluessel: ");
    scanf("%i", &key);
    fprintf(fc, "%i\n", key);
      while(getchar() != '\n');

  while (key < 1 || key > 26) {
    printf("Schluessel: ");
    scanf("%i", &key);
      while(getchar() != '\n');
  }
  FILE *fp;
  char plaintext[256];
  fp = fopen("decrypted.txt", "r");

  for (d = 0; d < 4; d++) {
    fgets(plaintext, 256, fp);
      if(fp == NULL)
        printf("Datei nicht gefunden.");

    printf("\n\nKlartext: ");
    fprintf(fc, "\nKlartext: ");
    printf("%s", plaintext);
    fprintf(fc, "%s", plaintext);

    printf("Chiffrat: ");
    fprintf(fc, "Chiffrat: ");
    caesarcipher(plaintext, key);
  }
return (0);
}
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    8,4 KB · Aufrufe: 352
  • Unbenannt2.png
    Unbenannt2.png
    10 KB · Aufrufe: 362
:confused_alt:

Nichts für ungut, aber verstehst Du, was der Programmcode tut?

Also, this may be just me aber irgendwie sieht mir das nach Hausaufgabe aus. Mag täuschen.
 
Du versuchst, encrypted.txt mehrfach zu öffnen. Das geht so nicht.
Am besten den zu schreibenden Dateiinhalt in einem Buffer aufbauen und dann zum Schluss gesammelt rausschreiben.
Übrigens ist diese Anneinanderreihung von if-Strukturen grausam. Warum nicht statt
Code:
if a==1 ...
elseif a==2 ...
elseif a==3 ...
lieber
Code:
if (0<a && a<4) ...
? Es sind ja schließlich integers. Oder auch wenigstens ein switch/case
 
  • Gefällt mir
Reaktionen: Teepause
BAGZZlash schrieb:
sorry wusste nicht das man das machen muss.

simpsonsfan schrieb:
Du versuchst, encrypted.txt mehrfach zu öffnen. Das geht so nicht.
Am besten den zu schreibenden Dateiinhalt in einem Buffer aufbauen und dann zum Schluss gesammelt rausschreiben.
Übrigens ist diese Anneinanderreihung von if-Strukturen grausam. Warum nicht statt
Code:
if a==1 ...
elseif a==2 ...
elseif a==3 ...
lieber
Code:
if (0<a && a<4) ...
? Es sind ja schließlich integers. Oder auch wenigstens ein switch/case
Danke ich werds mal versuchen
 
simpsonsfan schrieb:
Du versuchst, encrypted.txt mehrfach zu öffnen. Das geht so nicht.
Am besten den zu schreibenden Dateiinhalt in einem Buffer aufbauen und dann zum Schluss gesammelt rausschreiben.
Übrigens ist diese Anneinanderreihung von if-Strukturen grausam. Warum nicht statt
Code:
if a==1 ...
elseif a==2 ...
elseif a==3 ...
lieber
Code:
if (0<a && a<4) ...
? Es sind ja schließlich integers. Oder auch wenigstens ein switch/case
hab jetzt ein buffer gemacht den code verschönert jetzt weis ich nur nicht wie ich aus der while schleife in meiner "caesarcipher" funktion die verschlüsselten buchstaben in meinen buffer bekomme sonnst funktioniert eig alles.

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void caesarcipher(char *plaintext, char key, char *buffer){
  int i = 0;
  int cyphervalue;
  char cypher;

  while (plaintext[i] != '\0' && strlen(plaintext) -1 > i){
    if(plaintext[i] < 'A'){
      printf("%c", plaintext[i]);
    }else{
      cyphervalue = ((int)plaintext[i] - 97 + key) % 26 + 97;
        if(cyphervalue > 90 && cyphervalue < 97) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
    cypher = (char)(cyphervalue);
      strcat(buffer, cypher);
      printf("%c", cypher);
    }
      i++;
  }
}
int main(){
  int d;
  char bkey[64];
  int key;
  char buffer[1000];
  FILE *fp;
  char plaintext[256];
  fp = fopen("decrypted.txt", "r");

  printf("Schluessel: ");
    scanf("%i", &key);
      while(getchar() != '\n');

  while (key < 1 || key > 26) {
    printf("Schluessel: ");
    scanf("%i", &key);
      while(getchar() != '\n');
  }

  itoa(key, bkey, 10);
  strcat(buffer, "Schluessel: ");
  strcat(buffer, bkey);

  for (d = 0; d < 4; d++) {
    fgets(plaintext, 256, fp);
      if(fp == NULL)
        printf("Datei nicht gefunden.");

  printf("\n\nKlartext: ");
  strcat(buffer, "\n\nKlartext: ");
  printf("%s", plaintext);
  strcat(buffer, plaintext);


  printf("Chiffrat: ");
  strcat(buffer, "Chiffrat: ");
  caesarcipher(plaintext, key, buffer);

  }
  printf("\n\n\n\n");
  printf("%s\n", buffer);
return (0);
}
 
Vorsicht, strcat erwartet zwei String, kein char. Dir muss klar sein, dass ein String ein char-pointer auf einen Speicherbereich mit den Chars ist, der mit '\0' abgeschlossen wird.
Du kannst bspw. in Zeile 17 statt
Code:
strcat(buffer, cypher);
Code:
sprintf(buffer, "%s%c", buffer, cypher);
verwenden. (Es ist so gesehen etwas aufwändig, den kompletten String zu kopieren, wenn du nur etwas anfügen willst, aber prinzipiell machbar. Alternativ kannst du auch immer noch bspw. den Filepointer an caesarcipher als Argument übergeben, so wie hier *buffer und dann tatsächlich mit fwrite weiterschreiben.)
itoa ist übrigens keine Standardfunktion, falls du Portabilität willst, solltest du das evtl. ersetzen.

Ansonsten sollte es ja dann funktionieren. Bei mir landet mit der kleinen Anpassung mit sprintf jedenfalls auch der chiffrierte Text im Buffer.

Und ja, in einem Forum wird es grundsätzlich lieber gesehen, wenn nicht gleichzeitig in mehreren Foren gepostet wird oder falls, dann wenigstens die jeweiligen Ergebnisse vom TE gebündelt werden.
 
  • Gefällt mir
Reaktionen: Teepause
Ich habs jetzt geschafft.
es funktioniert so wie es soll.
Danke an alle die mir geholfen haben ich schicke anbei noch mein
Code falls ihn wer sehen will und vllt verbesserungs vorschläge hat.

PS. Leck mich am arsch kann Programmieren schwierig sein :D

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void caesarcipher(char *plaintext, int key, char *buffer){
  int i = 0;
  int b = 0;
  int cyphervalue;
  char cypher;
  char bufer[200];
  int len;

  len = sizeof(bufer);
    for(int b = 0; b < len; b++){
      bufer[b] = '\0';
    }
  while (plaintext[i] != '\0' && strlen(plaintext) -1 > i){
    if(plaintext[i] < 'A'){
      printf("%c", plaintext[i]);
        strncat(bufer, &plaintext[i], 1);
    }else{
      cyphervalue = ((int)plaintext[i] - 97 + key) % 26 + 97;
        if(cyphervalue > 90 && cyphervalue < 97) cyphervalue = (cyphervalue - 97 + 6) % 26 + 97;
    cypher = (char)(cyphervalue);
      printf("%c", cypher);
        strncat(bufer, &cypher, 1);
    }
      i++;
  }
    strcat(buffer, bufer);
}
int main(){
  int d;
  char bkey[64];
  int key;
  char buffer[1000];
  FILE *fp;
  char plaintext[256];
  fp = fopen("decrypted.txt", "r");

  printf("Schluessel: ");
    scanf("%i", &key);
      while(getchar() != '\n');

  while (key < 1 || key > 26) {
    printf("Schluessel: ");
    scanf("%i", &key);
      while(getchar() != '\n');
  }
  itoa(key, bkey, 10);
  strcat(buffer, "Schluessel: ");
  strcat(buffer, bkey);

  for (d = 0; d < 4; d++) {
    fgets(plaintext, 256, fp);
      if(fp == NULL)
        printf("Datei nicht gefunden.");

  printf("\n\nKlartext: ");
  strcat(buffer, "\n\nKlartext: ");
  printf("%s", plaintext);
  strcat(buffer, plaintext);

  printf("Chiffrat: ");
  strcat(buffer, "Chiffrat: ");
  caesarcipher(plaintext, key, buffer);
  }
  fclose(fp);

  FILE *fc;
  fc = fopen("encrypted.txt", "a");
  if(fc == NULL) {
    printf("Datei konnte NICHT geoeffnet werden.\n");
  }else{
    fprintf(fc, "%s\n\n\n", buffer);
    fclose(fc);
  }

return (0);
}
 
  • Gefällt mir
Reaktionen: simpsonsfan
Zurück
Oben