2016-11-30 3 views
1
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 


void encrypt(char *theString, int shift) { 
    while (*theString) { 
     if (isalpha(*theString)) { 
      *theString += shift; 
     } 
     theString++; 
    } 
} 

int main(void) { 
    int shift; 
    int *ip; 

    ip = &shift; 
    char theString[80]; 
    printf("Enter String: "); 
    fgets(theString, 80, stdin); 
    printf("Enter Number: "); 
    scanf("%d", &shift); 

    encrypt(theString,shift); 
    puts(theString); 

    return(0); 
} 

Vous avez obtenu ce point, merci pour l'aide. Maintenant, j'ai besoin d'aide pour revenir à 'A' quand l'utilisateur tape 'Z', au lieu d'aller à [(et pour les lettres minuscules). Je sais que j'ai besoin de quelques déclarations if, je ne sais pas lesquelles. Merci pour toute aide.César Cipher Retour à 'A'/'a'

+1

Vous devrez vérifier la valeur ASCII après le décalage, c'est plus grand que 'Z', puis soustrayez 26 et vous rebouclez. Décrypter sera simplement le contraire. Je suppose également que le montant du changement ne sera jamais supérieur à 26 pour cela –

+1

Votre indentation me rend triste. – kay

+1

@Kay Impossible d'avoir une augmentation de l'indentation causé la tristesse du monde. Reformaté pour votre plaisir! –

Répondre

1

Commencez par faire pivoter le caractère. Cela peut entraîner des caractères non valides (en passant par Z). Après la rotation du caractère, vérifiez le caractère pour voir s'il est supérieur à "Z". Si c'est le cas, alors vous devez savoir jusqu'où il est passé. Pour ce faire, soustrayez 'Z' du caractère.

Vous avez maintenant "à quelle distance Z" le personnage est. Vous devez prendre ce nombre et le convertir en "combien de temps passé A", ce qui signifie que vous soustrayez 1.

Maintenant que vous avez "jusqu'où passé A", vous pouvez simplement ajouter le caractère "A" au valeur, et vous obtiendrez la valeur désirée. Pour résumer, "soustraire" Z ", ajouter" A "et soustraire 1".

while (*theString) { 
    if (isalpha(*theString) && isLower(*theString)) { 
     *theString += shift; 
     while (*theString > 'z') { 
      *theString = *theString - 'z' - 1 + 'a'; 
     } 
    } else if (isalpha(*theString) && isUpper(*theString)) { 
     *theString += shift; 
     while (*theString > 'Z') { 
      *theString = *theString - 'Z' - 1 + 'A'; 
     } 
    } 
    theString++; 
} 
+1

"soustraire" Z "ajouter" A "et soustraire 1", ou simplement soustraire 26. Je pense que nous pouvons prendre le nombre de lettres dans l'alphabet ASCII comme une constante bien connue. :) – kay

+2

@Kay Toujours agréable d'éviter les nombres magiques, même quand ils fonctionnent :) –

+2

Ce n'est pas une méthode conforme à la norme C. La norme C exige seulement que les chiffres ''0'' -''9 '' soient représentés de façon consécutive. –