2016-03-26 5 views
-1

Ich versuche, eine Funktion, die eine Zeichenfolge und eine Zahl und wenn die Zahl größer ist die '0', so dass es die Caesar-Chiffre mit der Zeichenfolge und der Zahl, dass der Benutzer eingegeben. zum Beispiel -> 'stack' und die Nummer ist '3' -> 'uvdfn'. Wenn die Zahl '0' ist, wird die Zeichenfolge umgekehrt. zum Beispiel - 'stack' -> 'kcats'Problem mit Caesar-Chiffre und Reverse-Text-Programm

Ich weiß nicht, was ist das Problem mit dem Code, ich sehe nichts falsch.

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

 
void decryptText(char* encText, int n); 
 

 
#define STR_SIZE 50 
 
int main(void) 
 
{ 
 
\t char str[STR_SIZE]; 
 
\t int num = 0; 
 

 
\t printf("Please enter the string : "); 
 
\t fgets(str, STR_SIZE, stdin); 
 

 
\t printf("Please enter a number : "); 
 
\t scanf("%d", &num); 
 

 
\t decryptText(str, num); 
 

 
    system("PAUSE"); 
 
\t return 0; 
 
} 
 

 

 
void decryptText(char* encText, int n) 
 
{ 
 
\t int i = 0; 
 
\t int j = 0; 
 
\t char temp = 0; 
 

 
\t int strLen = strlen(encText); 
 

 
\t if (n > 0) 
 
\t { 
 
\t \t for (i = 0; i < strLen; i++) 
 
\t \t { 
 
\t \t \t if (*(encText + i) == ' ') { } 
 
\t \t \t else 
 
\t \t \t { 
 
\t \t \t \t if (*(encText + i) >= 'x') 
 
\t \t \t \t { 
 
\t \t \t \t \t *(encText + i) = (*(encText + i)) - 26; 
 
\t \t \t \t } 
 
\t \t \t \t *(encText + i) = (*(encText + i)) + n; 
 
\t \t \t } 
 
\t \t } 
 

 
\t \t printf("The array after the program deciphered it : \n"); 
 
\t \t printf("%s", encText); 
 
\t } 
 

 
\t else if (n == 0) 
 
\t { 
 
\t \t for (i = 0; i < strLen; i++) 
 
\t \t { 
 
\t \t \t for (j = 0; j >= 0; j--) 
 
\t \t \t { 
 
\t \t \t \t temp = *(encText + i); 
 
\t \t \t \t *(encText + i) = *(encText + j); 
 
\t \t \t \t *(encText + i) = temp; 
 
\t \t \t } 
 
\t \t } 
 

 
\t \t printf("The array after the program cracked it : \n"); 
 
\t \t printf("%s", encText); 
 
\t } 
 
}

+3

"Ich weiß nicht, was das Problem mit dem Code" - na ja, wir wissen es auch nicht. Warum brauchen Sie nicht ein paar Minuten, um genau zu erklären, was das Problem ist? (d. h. mit welcher Eingabe haben Sie es getestet, welche inkorrekte Ausgabe haben Sie erhalten? Was waren Ihre Beobachtungen, als Sie Ihren Code Schritt für Schritt getestet haben?). –

+0

'für (j = 0; j> = 0; j -)' wird nichts tun. –

+0

Hey Barak, sorry ... Das Problem ist, dass im Falle der Caesar-Chiffre nichts passiert, es druckt nicht das Ergebnis davon. Im Fall des umgekehrten Texts wird derselbe String ausgegeben, den der Benutzer eingegeben hat. @barakmanos –

Antwort

0
if (*(encText + i) >= 'x') 
    { 
     *(encText + i) = (*(encText + i)) - 26; 
    } 

in Ihrem kodierenden Teil

if (*(encText + i) + n > 'z') 
{ 
    *(encText + i) = (*(encText + i)) - 26; 
} 
+0

Danke, aber aus irgendeinem Grund, wenn ich 'wxyz' als Zeichenfolge und '4' als Zahl eingeben, druckt '{|} ~' –

0

Der Fehler sein sollte, ist der folgende Auszug:

if (*(encText + i) >= 'x') 
{ 
    *(encText + i) = (*(encText + i)) - 26; 
} 
*(encText + i) = (*(encText + i)) + n; 

Vor allem yo Sie müssen feststellen, ob Sie Eingaben in Klein- oder Großbuchstaben erhalten. Für den Anfang nehmen wir nur Kleinbuchstaben an. In diesem Snippet müssen Sie zuerst ein 'a' vom tatsächlichen Zeichen subtrahieren, zweitens die gewählte Rotationszahl zum berechneten Wert addieren, drittens das Modul davon berechnen und viertens ein 'a' zum Wert hinzufügen.

char temp; 
temp = *(encText + i); 
temp -= 'a'; 
temp += n; 
temp %= 26; 
temp += 'a'; 
*(encText + i) = temp; 

oder kurz:

*(encText + i) = (*(encText + i) - 'a' + n) % 26 + 'a'; 

BTW: Ihre Cracken sehen nicht sehr effektiv ...