Forum: PC-Programmierung Decoder in C programmieren


von JonasR (Gast)


Lesenswert?

Hallo zusammen,

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

Jeder Buchstabe ist darin rollierend um den Wert 15 verschoben. Nach z 
fängt es wieder bei a an.

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

von User (Gast)


Lesenswert?

Das Buch hier durcharbeiten:

https://en.wikipedia.org/wiki/The_C_Programming_Language

danach sollte das kein Problem mehr sein

von Tubetown (Gast)


Lesenswert?

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

C lernen?

von Dirk B. (dirkb2)


Lesenswert?

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

Nach Caesar-Verschlüsselung C suchen - aber das kann dein Tutor auch.

von nfet (Gast)


Lesenswert?

char decode(char Buchstabe) {
switch(Buchstabe) {
case 'a': return 'o';
case 'b': return 'p';
...
}
}

Ich denke du kannst das alleine vervollständigen.

von Gustl B. (-gb-)


Lesenswert?

Wenn Buchstabe + 15 <= z dann
   Ausgabe = Buchstabe + 15
sonst
   Ausgabe = Buchstabe + 15 - z

: Bearbeitet durch User
von nur für Großbuchstaben (Gast)


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)

von Daniel A. (daniel-a)


Lesenswert?

1
#include <stdio.h>
2
3
int main(){
4
  for(unsigned x; (x=getchar()) != EOF; ){
5
    if(x >= 'a' && x <= 'z'){
6
      x = (((x-'a')+15) % ('z'-'a'+1)) + 'a';
7
    }else if(x >= 'A' && x <= 'Z'){
8
      x = (((x-'A')+15) % ('Z'-'A'+1)) + 'A';
9
    }
10
    putchar(x);
11
  }
12
}

von Rolf M. (rmagnus)


Lesenswert?

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

Ich würde erst mal selber versuchen, die Aufgabe zu lösen. Wenn ich dann 
auch mit Hilfe der Lehrmaterialien nicht weiterkäme, würde ich das, was 
ich habe, hier posten und nachfragen, was ich falsch mache.

> Was könnte helfen?

Sich auf den Hosenboden zu setzen und zu lernen.

von c#-heater (Gast)


Lesenswert?

1
ShellExecute(0, 0, L"https://rot13.com/", 0, 0 , SW_SHOW );

von tuesdoch (Gast)


Lesenswert?

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

würde mir einen Compiler nehmen und Code schreiben...

von A. S. (Gast)


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.

von Dirk B. (dirkb2)


Lesenswert?

nur für Großbuchstaben schrieb:
> 26 = Anzahl der Buchstaben (A, B, C, ..., Z)

Oder Anzahl_Buchstaben = 'Z'-'A'+1; // bei ASCII

von Fpgakuechle K. (Gast)


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.

von JonasR (Gast)


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.

von Adam P. (adamap)


Lesenswert?

JonasR schrieb:
> Hallo,
> will einen Decoder in C programmieren

Warum erstellst du dafür wieder einen neuen Beitrag und schreibst nicht 
in dem von gestern weiter?

von wendelsberg (Gast)


Lesenswert?

Vollkommen unuebersichtlich wegen fehlender/falsche Einrueckungen, 
deswegen habe ich da gar nicht weiter nachgesehen.
Die Fehlerbeschreibung ist auch arg verbesserungswuerdig.

wendelsberg

von Dirk B. (dirkb2)


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.

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Liste Fehler, Warnmeldungen und Output hier.

Hat es mit festen Werten für Zeichenkette und key funktioniert? Ja? Oder 
hast Du das gar nicht ausprobiert und 3 Schritte übersprungen?

von 🐧 DPA 🐧 (Gast)


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?

von JonasR (Gast)


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?

von Dirk B. (dirkb2)


Lesenswert?

JonasR schrieb:
> nur wie könnte die aussehen?

Was war denn an deinem alten Code verkehrt?
Bzw. was hat der anders gemacht als du erwartet hast?

von JonasR (Gast)


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

von A. S. (Gast)


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.

von Dirk B. (dirkb2)


Lesenswert?

Was gibst du denn bei der Frage "Um welchen Wert sind die Buchstaben 
verschoben?" ein?

von JonasR (Gast)


Lesenswert?

Dirk B. schrieb:
> Was gibst du denn bei der Frage "Um welchen Wert sind die
> Buchstaben
> verschoben?" ein?

15...

von JonasR (Gast)


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?

von Dirk B. (dirkb2)


Lesenswert?

JonasR schrieb:
> Dirk B. schrieb:
>> Was gibst du denn bei der Frage "Um welchen Wert sind die
>> Buchstaben
>> verschoben?" ein?
>
> 15...

Für 15 gibt es kein case im switch.
Demnach steht da auch Error -und das hätte dir auffallen müssen.

Du benutzt da das i leider zu oft.

: Bearbeitet durch User
von Dirk B. (dirkb2)


Lesenswert?

Welchen Wert hat ch in Zeile 20?

von Horst V. (hoschti)


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. :-)

von A. S. (Gast)


Lesenswert?

JonasR schrieb:
> bekomme immer nur den verschlüsselten Code angezeigt.

Ja. CH ist immer 0, die Zuweisung am Anfang fehlt.

von Adam P. (adamap)


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)

von Tim T. (tim_taylor) Benutzerseite


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
}

: Bearbeitet durch User
von Tim T. (tim_taylor) Benutzerseite


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
}

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

... so kann man auch einen Contest zur kürzesten/schnellsten
Caesar-Verschlüsselung in C starten.

von 🐧 DPA 🐧 (Gast)


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
}

von nur Kleinbuchstaben (Gast)


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);

von Robert K. (Firma: Zombieland) (rko)


Lesenswert?

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?

: Bearbeitet durch User
von Tim T. (tim_taylor) Benutzerseite


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.

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

>> Contest zur kürzesten/schnellsten Caesar-Verschlüsselung
> Ich biete 5 Zeilen!
Da man mindestens die Schleife auch in einer Zeile schreiben könnte, 
müsste man für eine gerechte Wertung die Länge in Bytes heranziehen.

;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.