2014-02-13 8 views
-1

Я пытаюсь реализовать шифр Цезаря, но я не получаю ожидаемого результата. Что не так с кодом?Что не так в этой реализации Caesar Cipher?

Key: 3 
Input: Hello 
Output I'm getting: KNUUX  
Expected Output: KHOOR 

Код:

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

int main(int argc, string argv[]) 
{ 
    if(argc!=2) 
    { 
     return 1; 
    } 
    int k, i; 
    k = atoi(argv[1]); 
    printf("Enter the String to Encrypt: "); 
    string s=GetString(); 
    for(i=0; i<strlen(s); i++) 
    { 
     if('A'>=s[i]<='Z') 
     { 
      s[i]=((s[i] - 'A' + k)%26) +'A'; 
     } 
     else if('a'>=s[i]<='z') 
     { 
      s[i]=((s[i] - 'a' + k)%26) +'a'; 
     } 
    } 
    printf("The Encrypted Text is %s\n",s);   
} 
+4

' 'А'> = s [я] <= 'Z'' ???? – devnull

+0

Используйте 'isupper()' и 'islower()' – chux

+0

Некоторые советы, так как вы новичок, (1) код, который компилирует всегда полезно, (2) typedef'ing или '# define'-ing' char * ' поскольку 'string' *** не *** полезно; *Когда-либо*. – WhozCraig

ответ

3
if('A'>=s[i]<='Z') 

, конечно, не делать то, что вы, кажется, ждет.

Вы, вероятно, хотите:

if ((s[i] >= 'A') && (s[i] <= 'Z')) 
+1

Понимает, что сравнение обратное на первом выражении. – WhozCraig

+0

@WhozCraig ... и это то, что я получаю для копирования/вставки из бессмысленного кода. Благодарю. –

+0

Не беспокойтесь и +1 кстати. – WhozCraig

1
for(i=0; s[i]; ++i) 
    if(isalpha(s[i])) 
     s[i]=(toupper(s[i]) - 'A' + k)%26 +'A';