2016-03-17 1 views
-5

Ce code est supposé chiffrer le texte en fonction de la clé d'entrée de l'argument de commande et imprimer le texte chiffré. Cependant, il n'imprime pas les espaces et la ponctuation. Quelqu'un peut-il expliquer ce qui ne va pas?Le programme n'imprime pas d'espaces et de perforation

Exemple d'utilisation:

$ ./caesar 12 
world, say hello! 
iadxp, emk tqxxa! 
$ 

code:

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

int main(int argc, string argv[]) 
{ 
    if (argc>2 || argc<2) 
    { 
     printf("Please enter a valid argument.\n"); 
     return 1; 
    } 

    string input = GetString(); 

    int key = atoi(argv[1]); 

    for(int i = 0, l = strlen(input); i < l; i++) 
    { 
     //if(isalpha(input[i])) 
     //{ 
      char c = input[i]; 
      int letternum = c; 

      if(isupper(c)) 
      { 
       int upper = 'A'; 
       int alphanum = letternum - upper; 

       int newint = (alphanum + key) % 26; 

       newint = newint + upper; 

       char newchar = newint; 

       printf("%c", newchar); 
      } 

      if(islower(c)) 
      { 
       int lower = 'a'; 
       int alphanum = letternum - lower; 

       int newint = (alphanum + key) % 26; 

       newint = newint + lower; 

       char newchar = newint; 

       printf("%c", newchar); 
      } 
     //} 

    }  

    printf("\n"); 
} 
+1

Où est le code et nous montrer comment vous l'exécutez et la sortie attendue. – sjsam

+1

Il est dans la ligne 42 (il est toujours), colonne 23. Sérieusement: Vous dites ce qui ne va pas ce que vous attendez et montrez votre code. Voir [demander]. – Olaf

+0

Envisagez d'utiliser 'isalpha' pour déterminer si le caractère est une lettre à chiffrer, sinon le caractère" tel quel "est généré. –

Répondre

1

Ajouter else après if() blocs.

Changement de

 if(isupper(c)) { 
     ... 
     } 
     if(islower(c)) { 
     ... 
     } 

à

 if(isupper(c)) { 
     ... 
     } else if(islower(c)) { 
     ... 
     } else { 
     putc(c); 
     } 

Note: le code pédant utiliserait ce qui suit comme is...() fonctions sont définies pour toutes les valeurs int dans la gamme de unsigned char et EOF.

isupper((unsigned char) c) 
islower((unsigned char) c) 

Note2: Le code aura des problèmes si alphanum + key < 0. Peut vouloir ajouter un test pour assurer key n'est pas trop négatif ou utiliser ce qui suit pour assurer key >= 0.

int key = atoi(argv[1]) % 26 + 26; 

Note3: le code OP suppose A-Z et a-z sont consécutifs comme dans ASCII encodage (ce qui est certainement le cas 99,99 +% du temps.) Mais pas dans EBCDIC