2016-09-18 5 views
-6
#include<stdio.h> 
#include<cs50.h> 
#include<ctype.h> 
#include<string.h> 
int main(int argc, string argv[]){ 
int k,j,i=0,ch,pos; 
bool apha=true; 
string in = GetString(); 
int num = strlen(in); 
    for(int z=0;z<strlen(argv[1]);z++){ 
     if(!isalpha(argv[1][z])){ 
     apha=false; 
     } 
    } 
    if(argc!=2||!apha){ 
    printf("Dude we only accept alphabets..."); 
    return 1; 
    } 
string key = argv[1]; 
int keylength = strlen(key); 
    for (i=0,j=0;i<num;i++,j++){ 
     if(isupper(key[i])){ 
      k=key[j%keylength]-'A'; 
     } 
     if(islower(key[i])){ 
     k=key[j%keylength]-'a'; 
     } 
      if(isupper(in[i])){ 
       pos=in[i]-'A'; 
       ch = ((pos + k)%26) + 'A'; 
       printf("%c",ch); 
      } 
      if(islower(in[i])){ 
       pos=in[i]-'a'; 
       ch = ((pos + k)%26) + 'a'; 
       printf("%c",ch); 
      } 
      if(isspace(in[i])){ 
       printf(" "); 
      } 
      if(ispunct(in[i])){ 
       printf("%c",in[i]); 
      } 
    } 
printf("\n"); 
} 

Выходной условие проверяет: :) vigenere.c существуетVigenere Cipher логическая ошибка

:) vigenere.c компилирует

:) шифрует "а" как "" с помощью "а", как ключевое слово

:(шифрует "мир, поздороваться!", как "xoqmd, RBY gflkp!", используя "БАЗ" в качестве ключевого слова

\ ожидаемого результата, но не "xoqkj, yfd gfllp! \ п"

:(шифрует "BaRFoo" как "CaQGon" с помощью "БАЗ" в качестве ключевого слова

\ ожидаемого результата, но не "CaQEun \ п"

:(шифрует "BARFOO" как "CAQGON", используя " БАЗ»в качестве ключевого слова

\ ожидаемого результата, но не "CAQEON \ п"

:(обрабатывает отсутствие ARGV [1]

\ ожидаемого результата, а не для ввода оперативной

:(ручки ARGC> 2

\ ожидаемого результата, а не приглашение для ввода

:(отвергает "Hax0r2" в качестве ключевого слова

\ ожидаемого результата, а не приглашение для ввода

Что не так с моим кодом? Я тщательно изучил логику, и, похоже, ошибка в том, как ключ был завернут, хотя я не мог найти никаких ошибок. Где я ошибся?

+0

«.. \ ожидаемый вывод, а не подсказка для ввода». Это получило хмурое лицо, потому что нет кода, который запрашивает ввод? – usr2564301

+0

Ну, может быть ... но что это простая ошибка (более или менее), это логическая ошибка, которая пугает меня. –

+0

SO в основном полезен для запроса явных вопросов, отладка/исправление кода почти никогда не бывает полезным для других. Обратитесь за помощью в свое учреждение. –

ответ

1

Есть несколько проблем с кодом:

проверяемом ошибка не является правильным. Вы проверяете if(argc!=2||!apha) после того, как вы уже оценили strlen(argv[1]) - к тому времени уже слишком поздно! Проверяйте действительность argc перед обращением к argv и не удваивайте ошибку счетчика аргументов и ошибку в алфавитном ключе, они независимы. Кроме того, сообщения об ошибках должны идти до stderr, а не stdout.

Вы полностью не обращаете внимания на индексацию ключа. Как было отмечено @Bob__, индексация в этом коде:

if(isupper(key[i])){ 
    k=key[j%keylength]-'A'; 
} 

должна соответствовать

if (isupper(key[j % keylength])) { 
    k = key[j % keylength] - 'A'; 
} 

Но также, вы не увеличивающиеся j правильно, вы его отслеживания i:

for (i=0,j=0;i<num;i++,j++){ 

Вместо этого i должен увеличивать для каждого символа входной строки, j должен увеличиваться для каждой зашифрованной буквы в строка ввода.

Переделка код, чтобы исправить вышеуказанные ошибки и проблемы общего стиля, мы получаем что-то вроде:

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

int main(int argc, string argv[]) { 

    if (argc != 2) { 
     fprintf(stderr, "Please supply an encryption key.\n"); 
     return 1; 
    } 

    string key = argv[1]; 
    int key_length = strlen(key); 
    bool is_alpha = true; 

    for (int z = 0; z < key_length; z++) { 
     if (!isalpha(key[z])) { 
      is_alpha = false; 
     } 
    } 

    if (!is_alpha) { 
     fprintf(stderr, "Sorry, we only accept alphabetic keys.\n"); 
     return 1; 
    } 

    string in = GetString(); 
    size_t length = strlen(in); 

    for (int i = 0, j = 0; i < length; i++) { 

     if (isalpha(in[i])) { 

      int ch, k = key[j++ % key_length]; 

      if (isupper(k)) { 
       k -= 'A'; 
      } else { 
       k -= 'a'; 
      } 

      if (isupper(in[i])) { 
       int pos = in[i] - 'A'; 
       ch = ((pos + k) % 26) + 'A'; 
      } else { 
       int pos = in[i] - 'a'; 
       ch = ((pos + k) % 26) + 'a'; 
      } 

      printf("%c", ch); 
     } else if (isspace(in[i])) { 
      printf(" "); 
     } else if (ispunct(in[i])) { 
      printf("%c", in[i]); 
     } 
    } 

    printf("\n"); 

    return 0; 
} 

ИСПОЛЬЗОВАНИЕ МОДЕЛИРОВАНИЯ

> ./a.out baz 
world, say hello! 
xoqmd, rby gflkp! 
> 
0

Вот ответ я получил IT-

-Проблессирующую ошибку, скорее всего, это:

if(isupper(key[i])){ 
    k=key[j%keylength]-'A'; 
    } 

Он должен проверить соответствующий символ так должен проверить:

if (isupper(key[j % keylength])) { 
    k = key[j % keylength] - 'A'; 
    } 

-Также, приращение замочную прироста важно, чтобы сделать это просто увеличиваем только если это алфавит. Таким образом, необходима проверка isalpha (так как вы не хотите, чтобы персонаж менялся даже на пробел).