2017-10-08 6 views
0
#define _CRT_SECURE_NO_WARNINGS 
#include "stdio.h" 


int main() 
{ 
    char name[100]; 
    int key; 
    printf("enter plaintext:\n"); 
    fgets(name, 100, stdin); 
    int length = sizeof(name); 
    printf("please enter key:"); 
    scanf("%d", &key); 
    printf("plain text: %s\n", name); 
    printf("ciphertext:"); 
    for (int i = 0; i < length; i++) { 
     if (name[i] >= 65 && name[i] <= 90) { 
      int c = (int)(name[i] - 'A'); 
      char d = 'A' + (char)((c + key) % 26); 
      printf("%c", d); 
     } 
     else if (name[i] >= 97 && name[i] <= 122) { 
       int c = (int)(name[i] - 'a'); 
       char d = 'a' + (char)((c + key) % 26); 
       printf("%c", d); 
     } 
     else 
      printf("%c", name[i]); 
    } 
    return 0; 
} 

Bonjour, C'est donc un exercice que j'ai essayé de résoudre au cours « CS50 » par Harvard. Il est un chiffre Ceasar, il faut une chaîne, une clé, et imprime le chiffrement: c = (pi + k)% 26lettres ordures imprime visuels - César chiffre excercise

c - la lettre finale déchiffré pi = la position de la lettre (a = 0. b = 1 ..) k = la clé

Mon programme donne la sortie à droite, mais les dernières impressions de lignes de caractères ordures: enter image description here

Je pensais que c'était parce que l'allocation de mémoire? Mais je ne l'ai pas encore touché, et je ne veux pas utiliser le paquetage cs50.h parce que je veux apprendre c tel qu'il est, et ne pas utiliser les variables "chaînes" comme ils le font.

Toute aide serait appréciée.

+0

vous avez 'sizeof' octets dans votre tampon, mais'% s' initialise seulement autant d'octets qu'il lit. Au lieu de boucler jusqu'à 'longueur', bouclez seulement à' strlen (nom) '(et ajoutez' ') –

Répondre

3

Votre question est la ligne

int length = sizeof(name); 

l'opérateur sizeof retourne la taille d'une variable en octets. Dans ce cas, puisque name est un char[100] la taille de cet objet est 100 octets. Dans l'exemple que vous avez donné le texte en clair (et le texte chiffré) étaient tous deux beaucoup plus petits afin que votre boucle a couru et a commencé à imprimer la mémoire de déchets (espace que vous avez attribué mais n'a pas utilisé pour stocker le message).

Ce que vous devez utiliser à la place est

int length = strlen(name); 

qui retourne la longueur de la chaîne. Veillez à inclure l'en-tête string.h.