2016-03-17 2 views
-5

Этот код предназначен для шифрования текста на основе ключа ввода аргумента команды и распечатки зашифрованного текста. Однако он не печатает пробелы и знаки препинания. Может кто-нибудь объяснить, что не так?Программа не печатает пробелы и пропуски

Пример использования:

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

Код:

#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

Где код и показать нам, как вы запускаете его и ожидаемый результат. – sjsam

+1

Это строка 42 (это всегда так), столбец 23. Серьезно: вы говорите, что не так, что вы ожидаете, и покажите свой код. См. [Ask]. – Olaf

+0

Рассмотрите возможность использования 'isalpha', чтобы определить, является ли символ буквой, подлежащей шифрованию, иначе выведите символ« как есть ». –

ответ

1

Добавить else после if() блоков.

Изменение от

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

в

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

Примечание: педантичный код будет использовать следующие функции в качестве is...() определены для всех int значений в диапазоне unsigned char и EOF.

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

Note2: Код будет иметь проблемы, если alphanum + key < 0. Может потребоваться добавить тест для страхования key не слишком отрицательный или использовать следующие, чтобы застраховать key >= 0.

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

Note3: код OP предполагает A-Z и a-z последовательны, как в ASCII кодирования (что, конечно, случай 99,99 +% времени.), Но не в EBCDIC

Смежные вопросы