2016-07-06 12 views
-3

Mein Code für CS50 pset2 Vigenere Chiffre ist wie folgt. Bitte hilf mir den Fehler zu finden. Dieser Code tut grundsätzlich nichts, wenn der Schlüssel den Buchstaben "a" enthält. Es heißt "Gleitkommaausnahme". Ich weiß nicht, was das bedeutet. Bitte gehen Sie durch den Code und sagen Sie mir, was der Fehler ist.Was ist los mit meinem Vigenere Cypher CS50

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

int main(int argc, string argv[]) 
{ 
    //check if there are only two command line arguments// 

    if (argc!=2) 
    { 
     printf("Please enter a valid input!\n"); 
     return 1; 
    }; 

    string key = argv[1]; 

    for(int i=0, n=strlen(key); i < n; i++) 
    { 
     //check if there is any number in the key// 

     if(!isalpha(key[i])) 
     { 
      printf("Invalid Key!\n"); 
      return 1; 
     }; 

     //converting the key into ints.// 

     if(islower(key[i])) 
     { 
      key[i] = key[i] - 'a'; 
     } 
     else if(isupper(key[i])) 
     { 
      key[i] = key[i] - 'A'; 
     }; 
    }; 

    //prompt user for the string// 

    string s = GetString(); 

    int c; 
    int k; 
    int stln = strlen(s); 
    int kyln = strlen(key);   

    for(int j = 0, m = strlen(s); j < m; j++) 
    { 
     if(islower(s[j])) 
     { 
      s[j] = s[j] - 'a'; 

      //for wrapping around the key// 

      if(stln > kyln) 
      { 
       k = j % strlen(key); 
       c = (s[j] + key[k]) % 26; 
       s[j] = 'a' + c; 
      } 
      else 
      { 
       c = (s[j] + key[j]) % 26; 
       s[j] = 'a' + c; 
      }; 
     } 
     else if (isupper(s[j])) 
     { 
      s[j] = s[j] - 'A'; 

      //for wrapping around the key// 

      k = j % strlen(key); 

      if(stln > kyln) 
      { 
       c = (s[j] + key[k]) % 26; 
       s[j] = 'A' + c; 
      } 
      else 
      { 
       c = (s[j] + key[j]) % 26; 
       s[j] = 'A' + c; 
      }; 
     }; 

    }; 

    printf("%s\n", s); 

}; 
+0

Zeige Definition von 'string'. – chux

+4

Off-Thema: Sie benötigen keine Semikola nach dem Schließen von geschweiften Klammern. Mit anderen Worten '};' sollte '}' – user3386109

+0

chux sein, definiert die cs50-Bibliothek string. Es ist nur typedef von char * http://mirror.cs50.net/library50/c/cs50-library-c-3.0/cs50.h – MacedonZero

Antwort

2

strlen(key) ist in späteren Code ungültig, wie früher Code Nullzeichen in key[] Injektion wurde, wenn ein 'a' oder 'A' verwendet wurde:

if(islower(key[i])) { 
    key[i] = key[i] - 'a'; 

die Stringlänge von key[] finden, bevor sein Inhalt und die Verwendung zu ändern, die

int n = strlen(key); 
... 
// k = j % strlen(key); 
k = j % n;