2017-05-13 12 views
-2

私はCS50のVigenere問題点を理解しようとしていますが、私は期待しているものが得られません。私は紙で使った事例を書いて手で数学を行いました。私がプログラムを実行するとき、私は全く異なる何かを得ています。加えて、プログラムはアルファベットを囲んでいない値のために働いています。私は引数 'bacon'を使用しています。ユーザーが受け取った文字列は 'Meet'になります。プログラムは最初の3文字 'Mee'ではうまく動作していますが、 't'に達するとうまく動作しません。理由を理解していない116 + 14 = -126(CS50)

このプログラムは、このケースでは 'BACON'であり、これらの値は文字列 'Meet'の対応するi番目の値をインクリメントするために使用されます。文字列のi番目の値をどれだけ増やすか、文字列のi番目の文字の値を示すコードを表示させました。私は間違って何をやっているのかよく分からない。どんな助けやヒントも大歓迎です!

P.S.この問題は、最後のforループ内で最後の 'else if'条件付きを伴います。

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

    int main(int argc, string argv[]) 
    { 
     // make sure command-line receives only one argument, excluding file 
      name 
     if(argc != 2) 
     { 
      printf("incorrect # of arguments, terminating program\n"); 
      return 1; 
     } 

     // make sure that only aplhabets are entered for argument 
     for(int i = 0,n=strlen(argv[1]); i<n; i++) 
     { 
      if(toupper(argv[1][i]) < 65 || toupper(argv[1][i]) > 90 ) 
      { 
       printf("non-alphabetical character found in argument, terminating program\n"); 
       return 2; 
      } 

     // convert argument to all UPPERCASE, to make lower and upper affect plain-text similarily 
     } 
     for(int i = 0,n=strlen(argv[1]); i<n; i++) 
     { 
      argv[1][i] = toupper(argv[1][i]); 
     } 


     printf("plaintext: "); 
     string plain = get_string(); 

     printf("ciphertext: "); 

     int m = strlen(argv[1]); 
     for(int i = 0,j=0,n=strlen(plain); i < n; i++,j++) 
     { 
      if(j == m) 
      { 
       j = 0; 
      } 

      int increment = argv[1][i] - 65;  // key: A = 0, B = 1 
      printf("value of increment: %i\n",increment); 

      if(plain[i] >= 65 && plain[i] <= 90)  // check for case of plain-text 
      { 
       plain[i] = (int) plain[i] + increment; 
       if((int) plain[i] > 90)    // see if wrapping occurs 
       { 
        increment = (int) plain[i]%90; 
        plain[i] = 65 + increment; 
       } 

      } 
      else if(plain[i] >= 97 && plain[i] <= 122) 
      { 
       printf("letter %c, value %i\n",plain[i],(int)plain[i]); 
       plain[i] = (int)plain[i] + increment; 
       printf("position %i, value %i\n",i,(int)plain[i]); 
       if((int) plain[i] > 122) 
       { 
        increment = (int) plain[i]%122; 
        plain[i] = 97 + increment; 
       } 
      } 
      else{ 
       j--; 
      } 
     } 
     printf("%s\n",plain); 

    } 
+2

プログラムのようなサウンドは、符号付きのchar変数を使用しています。範囲は-128から127になり、整数がオーバーフローしています。 –

+1

check 'CHAR_MAX' – BLUEPIXY

+1

signed char:130は-126になります。 –

答えて

3

プログラムは-128から+127に行くの範囲を持っているsigned char型の変数を、使用している、とあなたは、整数オーバーフローが発生しています。

関連する問題