Decoder in C programmieren

Gast #6703728
Lesenswert?

als Idee (nur für Großbuchstaben):
1
   char offset = 4;
2

3
   char str[] = "HALLOWELT";
4

5
   puts (str);
6

7
   // verschluesseln
8
   for (size_t i = 0; i < strlen (str); i++) {
9
      str[i] = 'A' + (str[i] - 'A' + offset) % 26;
10
   }
11

12
   puts (str);
13

14
   // entschluesseln
15
   for (size_t i = 0; i < strlen (str); i++) {
16
      char temp = str[i] - offset;
17

18
      if (temp >= 'A')
19
         str[i] = temp;
20
      else
21
         str[i] = 'Z' - ('A' - temp - 1);
22
   }
23

24
   puts (str);

26 = Anzahl der Buchstaben (A, B, C, ..., Z)
Gast #6704082
Lesenswert?

JonasR schrieb:
> Wie würdet ihr hierbei vorgehen?

Erstmal den Decoder Schreiben ohne dass er was tut. Also jeden 
Buchstaben X als X belässt.

Damit hast Du 99% der Aufgabe schon erfüllt.

Dann jeden Buchstaben um 1 verschieben, egal in welche Richtung (+1 oder 
-1). Und egal ob dabei ein Buchstabe rauskommt oder nicht.

Schauen, ob es in die richtige Richtung geht und notfalls korrigieren.

Dann Schauen, dass der Überlauf funktioniert (erstmal festlegen, wie der 
Überlauf funktionieren soll: aus z wird A oder aus Z wird A?)

Wenn Du das soweit hast, dann helfe ich Dir gerne dabei, dass um 15 
Zeichen zu verschieben.
Gast #6704100
Lesenswert?

JonasR schrieb:

> will einen Decoder in C programmieren, der einen bestimmten Text
> decodieren kann.

> Wie würdet ihr hierbei vorgehen? Was könnte helfen?

Die Vorbereiteneden Voelesungen/Schulstunden zu dieser Hausaufgabe 
besuchen und sich den vermittelten Stoff durch Selbststudium zu eigen 
machen.
Gast #6704123
Lesenswert?

Hallo,
will einen Decoder in C programmieren, wobei jeder Buchstabe des zu 
entschlüsselnden Textes rollierend um den Wert 15 verschoben ist. Nach z 
fängt es wieder bei a an.

Hab folgendes bisher gemacht:
1
#include<stdio.h>
2
 
3

4
int main(){
5
    
6
char Zeichenkette[100], ch;
7
int i, key;
8
    
9
printf("Geben Sie eine Zeichenkette ein, die entschüsselt werden soll: \n\n");
10
gets(Zeichenkette);
11
printf("Enter key: ");
12
scanf("%d", &key);
13
    
14
    
15
for(i = 0; Zeichenkette[i] != '\0'; i++){
16

17
    ch = Zeichenkette[i];
18
    
19
if(ch >= 'a' && ch <= 'z'){
20
    
21

22
    ch = ch - key;
23
if(ch < 'a'){
24
ch = ch + 'z' - 'a' + 1;
25
}
26
Zeichenkette[i] = ch;
27
}
28
else if(ch >= 'A' && ch <= 'Z'){
29
ch = ch - key;
30
if(ch < 'A'){
31
ch = ch + 'Z' - 'A' + 1;
32
}
33
Zeichenkette[i] = ch;
34
}
35
}
36
    
37
printf("Decodierte Nachricht: %s", Zeichenkette);
38
    
39
    
40
return 0;
41
}

Irgendwie funktioniert das noch nicht so richtig, deswegen brauche ich 
mal eure Expertise.
#6704139
Lesenswert?

"Irgendwie funktioniert das noch nicht so richtig," ist die dümmste 
Fehlerbeschreibung die es gibt.

Was passiert und was erwartest du was passieren soll.

Benutze eine vernünftige und einheitliche Einrückung: 
https://de.wikipedia.org/wiki/Einr%C3%BCckungsstil

Dann schauen sich das auch mehr Leute an.

gets() geht gar nicht und wurde abgekündigt.

Benutze Funktionen - also eigene.
Gast #6704180
Lesenswert?

Was geht denn nicht?
1
someone@something:~$ ./t
2
Geben Sie eine Zeichenkette ein, die entschüsselt werden soll:
3

4
Wtaad Ldgas!
5
Enter key: 15
6
Decodierte Nachricht: Hello World!someone@something:~$

Eventuell da noch ein Newline am Schluss hinsetzen:
1
printf("Decodierte Nachricht: %s\n", Zeichenkette);

Und statt gets fgets nehmen, aber ansonsten funktioniert's doch?
Gast #6704433
Lesenswert?

Hab jetzt neu angefangen und folgenden Code:
1
#include <stdio.h>
2
#include <string.h>
3

4
int main(){
5
    
6
    char str[100];
7
    
8
    printf("Geben Sie die Nachricht ein, die entschlüsselt werden soll: \n\n");
9
    
10
    fgets(str, 100, stdin);
11
    
12
    
13
    
14
    
15
    
16
    
17
    
18
    
19
    printf("Die decodierte Nachricht lautet: \n\n");
20
    printf("%s\n\n", str);
21
    
22
    
23
   return 0;
24
}

Klappt auch mit der Ausgabe. Jetzt muss ich noch jeden Buchstaben um 15 
verschieben. Hier bin ich leider komplett planlos... wie stellt man das 
an? For-Schleife... nur wie könnte die aussehen?
Gast #6704463
Lesenswert?

Aktueller Fortschritt:
1
#include <stdio.h>
2
#include <string.h>
3

4
int main(){
5
    
6
    char str[100];
7
    int i;
8
    
9
    
10
    printf("Geben Sie die Nachricht ein, die entschlüsselt werden soll: \n\n");
11
    
12
    fgets(str, 100, stdin);
13
    
14
    printf("Um welchen Wert sind die Buchstaben verschoben?\n\n");
15
    scanf("%d", &i);
16
    
17
    switch (i) {
18
        case 1:
19
            for(i = 0; (i < 100 && str[i] != '\0'); i++)
20
              str[i] = str[i] - 15;
21
            break;
22
            
23
        default:
24
            
25
            printf("\nError\n");
26
            break;
27
    }
28
    
29
    
30
    printf("Die decodierte Nachricht lautet: \n\n");
31
    printf("%s\n\n", str);
32
    
33
    
34
   return 0;
35
}

Wird immer noch nur das verschlüsselte Wort ausgegeben. Ich komme 
einfach nicht weiter...
Gast #6704472
Lesenswert?

JonasR schrieb:
> Jetzt muss ich noch jeden Buchstaben um 15 verschieben.

A. S. schrieb:
> Erstmal ... ohne dass er was tut. Also jeden
> Buchstaben X als X belässt.
Done
> Dann jeden Buchstaben um 1 verschieben, egal in welche Richtung (+1 oder
> -1). Und egal ob dabei ein Buchstabe rauskommt oder nicht.
> Schauen, ob es in die richtige Richtung geht und notfalls korrigieren.
> Dann Schauen, dass der Überlauf funktioniert (erstmal festlegen, wie der
> Überlauf funktionieren soll: aus z wird A oder aus Z wird A?)
> Wenn Du das soweit hast, dann helfe ich Dir gerne dabei, dass um 15
> Zeichen zu verschieben.

Das meiste hast Du doch schon gehabt. Mach einfach.
Gast #6704509
Lesenswert?

1
#include <stdio.h>
2
#include <string.h>
3

4
int main(){
5
    
6
    char str[100];
7
    char ch = 0;
8
    int i, k;
9
    
10
    
11
    printf("Geben Sie die Nachricht ein, die entschlüsselt werden soll: \n\n");
12
    fgets(str, 100, stdin);
13
    
14
    printf("Geben Sie an, um welchen Wert die Buchstaben verschoben sind: \n\n");
15
    scanf("%d", &k);
16
    
17
    
18
    
19
    for(i = 0; str[i] != '\0'; i++){
20
        if(ch >= 'a' && ch <= 'z'){
21
    
22
            ch = ch - k;
23
            
24
        if(ch < 'a'){
25
        
26
        ch = ch + 'z' - 'a' + 1;
27
        
28
        }
29
        
30
        str[i] = ch;
31
        
32
        }
33
        
34
        else if(ch >= 'A' && ch <= 'Z'){
35
        
36
           ch = ch - k;
37
        
38
        if(ch < 'A'){
39
        
40
            ch = ch + 'Z' - 'A' + 1;
41
    
42
        }
43
        
44
        str[i] = ch;
45
        
46
        }
47
        
48
    }
49
    
50
    
51
    printf("Die decodierte Nachricht lautet: \n\n");
52
    printf("%s\n\n", str);
53
    
54
    
55
   return 0;
56
}

Klappt immer noch nicht... bekomme immer nur den verschlüsselten Code 
angezeigt. Komme schon ganz durcheinander mit switch, case, if, for... 
was denn nun? Kann mir niemand helfen?
#6704553
Lesenswert?

Vielleicht noch ein Tip zur Fehlersuche:

Packe die decodierten Zeichen in einen eigenen String und gib am Ende 
beide (Original und decodiert) aus. Dann siehst Du leichter was sich 
wohin geschoben hat.

Manchmal kann es auch sinnvoll sein, Testausgaben in die Schleifen 
einzubauen. Wenn dann der Eingabestring erst mal kurz ist, wird's noch 
einfacher. :-)
#6704782
Lesenswert?

Mich würde ja viel mehr die Aufgabenstellung interessieren???

Ist es wirklich nur für Kleinbuchstaben?
Den eigentlich rotiert es durch a-z & A-Z.

Kommt auf das Verfahren drauf an...

Was steht denn da :-P ?

Wahrscheinlich etwas wo 10000000 Dinge nicht beachtet / erwähnt 
wurden...
(vom Aufgabensteller)
Gast #6704829
Lesenswert?

Aus dem Rückenmark:
1
#include <stdio.h>
2
#include <string.h>
3

4
void ROT(char *Zeichenkette, int key) {
5
  
6
  char Zeichen;
7
  int i;
8
  
9
  key %= 26;
10
  
11
  for(i = 0; i < strlen(Zeichenkette); i++) {
12
      
13
    Zeichen = Zeichenkette[i];
14
      
15
    if (((Zeichen >= 'A') && (Zeichen <= 'Z')) || ((Zeichen >= 'a') && (Zeichen <= 'z'))) {
16
      
17
      Zeichen += key;
18
      
19
      if ((Zeichen < 'A') || (Zeichen > 'z')) Zeichen -= 'z' - 'a' + 1; //bzw. 26
20
      else if ((Zeichen > 'Z') && (Zeichen < 'a')) Zeichen -= 'Z' - 'A' + 1; //bzw. 26
21
        
22
      Zeichenkette[i] = Zeichen;
23
    }
24
  }
25
}
26

27
int main(int argc, char *argv[]) {
28
    
29
  char Zeichenkette[100];
30
  int Key;
31
      
32
  printf("Geben Sie eine Zeichenkette ein, die entschüsselt werden soll: \n\n");
33
  fgets(Zeichenkette, sizeof(Zeichenkette), stdin);
34
  printf("Enter key: ");
35
  scanf("%d", &Key);
36
  
37
  printf("Nachricht: %s", Zeichenkette);
38
  
39
  ROT(Zeichenkette, Key);
40
      
41
  printf("Decodierte Nachricht: %s", Zeichenkette);
42
      
43
  return 0;
44
}
Gast #6704929
Lesenswert?

Meh, so doll war die Idee nicht, lieber das hier:
1
void ROT(char *Zeichenkette, int key) {
2
  char Zeichen;
3
  int i;
4

5
  key %= 26;
6
  if (key < 0) key += 26;
7
  
8
  for(i = 0; i < strlen(Zeichenkette); i++) {
9
    Zeichen = Zeichenkette[i];
10

11
    if ((Zeichen >= 'A') && (Zeichen <= 'Z')) {
12
      Zeichen -= key;
13
      if (Zeichen < 'A') Zeichen += 'Z' - 'A' + 1; //bzw. 26
14
    }
15
    else if ((Zeichen >= 'a') && (Zeichen <= 'z')) {
16
      Zeichen -= key;
17
      if (Zeichen < 'a') Zeichen += 'z' - 'a' + 1; //bzw. 26
18
    }
19

20
    Zeichenkette[i] = Zeichen;
21
  }
22
}
Gast #6705252
Lesenswert?

Ben B. schrieb:
> Contest zur kürzesten/schnellsten Caesar-Verschlüsselung

Ich biete 5 Zeilen!
1
void ROT(char *str, unsigned key) {
2
  for(unsigned char c; c=*str; str++)
3
    if('A' <= (c & ~0x20) && (c & ~0x20) <= 'Z')
4
      *str = ((c & ~0x20) - 'A' + key) % 26 + 'A' | (c & 0x20);
5
}
Gast #6705284
Lesenswert?

diesmal nur für Kleinbuchstaben (keine Zahlen, Whitespaces, etc.) und 0 
<= key <= 26 (man könnte es ja auch beschränken  a la key = abs(key)%27 
). Und für Großbuchstaben muss man ja 'a' durch 'A' ersetzen.
1
   char key = 5;
2

3
   char str[] = "hallowelt";
4

5
   puts (str);
6

7
   // verschluesseln
8
   for (size_t i = 0; i < strlen (str); i++) {
9
      str[i] = 'a' + (str[i] - 'a' + key) % 26;
10
   }
11

12
   puts (str);
13

14
   // entschluesseln
15
   for (size_t i = 0; i < strlen (str); i++) {
16
      str[i] = 'z' - ('z' - str[i] + key) % 26;
17
   }
18

19
   puts (str);
Gast #6705507
Lesenswert?

Robert K. schrieb:
> Tim T. schrieb:
>> Meh, so doll war die Idee nicht, lieber das hier:
> das Programm vorher von Dir war doch schon gut; bis auf die Eingabe key:
> 0 wird der Text immer verschlüsselt, bei negativen key Wert erfolgt dann
> Encodierung, alles okay.
> Welche Verbesserung bringt die Variation?

Bessere Erweiterbarkeit und es ist übersichtlicher.
Wenn man beispielsweise noch die Zahlen oder bestimmte Sonderzeichen mit 
hinzunehmen will, wird die Eingangsabfrage noch größer und die 
Nachkorrektur beim Hinauslaufen aus dem Zielbereich noch 
unübersichtlicher.
So ist es nur ein weiterer logisch aufgebauter 3 Zeilen Block für jeden 
zusätzlichen Bereich.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren