2017-05-13 2 views
-2

J'essaie de comprendre le problème de Vigenere de CS50 et je ne reçois pas ce que j'attends. J'ai écrit l'étui que j'ai utilisé sur papier et j'ai fait les calculs à la main, et lorsque j'exécute le programme, j'obtiens quelque chose de complètement différent. C'est un ajout et le programme fonctionne pour des valeurs qui ne sont pas enroulées autour de l'alphabet. J'utilise l'argument 'bacon' et la chaîne reçue par l'utilisateur va être 'Meet'. Le programme fonctionne bien pour les 3 premières lettres 'Mee', mais quand il atteint 't' ça ne marche pas très bien ...Je ne comprends pas pourquoi 116 + 14 = -126 (CS50)

Le programme s'exécute en trouvant la valeur ASCII de l'argument qui est converti en majuscule, dans ce cas c'est 'BACON', et ensuite ces valeurs sont utilisées pour incrémenter la valeur i'th correspondante dans la chaîne 'Meet'. Mon code indiquait combien il allait incrémenter la valeur i dans la chaîne, et la valeur du i-ème caractère dans la chaîne. Je ne suis pas entièrement sûr de ce que je fais incorrectement. Toute aide ou conseil serait grandement apprécié!

P.S. ce problème implique le dernier 'else if' conditionnel dans la dernière boucle for.

#include <stdio.h> 
    #include <cs50.h> 
    #include <string.h> 
    #include <ctype.h> 

    int main(int argc, string argv[]) 
    { 
     // make sure command-line receives only one argument, excluding file 
      name 
     if(argc != 2) 
     { 
      printf("incorrect # of arguments, terminating program\n"); 
      return 1; 
     } 

     // make sure that only aplhabets are entered for argument 
     for(int i = 0,n=strlen(argv[1]); i<n; i++) 
     { 
      if(toupper(argv[1][i]) < 65 || toupper(argv[1][i]) > 90 ) 
      { 
       printf("non-alphabetical character found in argument, terminating program\n"); 
       return 2; 
      } 

     // convert argument to all UPPERCASE, to make lower and upper affect plain-text similarily 
     } 
     for(int i = 0,n=strlen(argv[1]); i<n; i++) 
     { 
      argv[1][i] = toupper(argv[1][i]); 
     } 


     printf("plaintext: "); 
     string plain = get_string(); 

     printf("ciphertext: "); 

     int m = strlen(argv[1]); 
     for(int i = 0,j=0,n=strlen(plain); i < n; i++,j++) 
     { 
      if(j == m) 
      { 
       j = 0; 
      } 

      int increment = argv[1][i] - 65;  // key: A = 0, B = 1 
      printf("value of increment: %i\n",increment); 

      if(plain[i] >= 65 && plain[i] <= 90)  // check for case of plain-text 
      { 
       plain[i] = (int) plain[i] + increment; 
       if((int) plain[i] > 90)    // see if wrapping occurs 
       { 
        increment = (int) plain[i]%90; 
        plain[i] = 65 + increment; 
       } 

      } 
      else if(plain[i] >= 97 && plain[i] <= 122) 
      { 
       printf("letter %c, value %i\n",plain[i],(int)plain[i]); 
       plain[i] = (int)plain[i] + increment; 
       printf("position %i, value %i\n",i,(int)plain[i]); 
       if((int) plain[i] > 122) 
       { 
        increment = (int) plain[i]%122; 
        plain[i] = 97 + increment; 
       } 
      } 
      else{ 
       j--; 
      } 
     } 
     printf("%s\n",plain); 

    } 
+2

Il semble que votre programme utilise des variables char signées, dont la plage va de -128 à 127, et que vous rencontrez un débordement d'entier. –

+1

cocher 'CHAR_MAX' – BLUEPIXY

+1

car. Signé: 130 devient -126. –

Répondre

3

Votre programme utilise des variables de type char signé, qui ont une gamme qui va de -128 à 127, et que vous rencontrez un débordement d'entier.