不明白为什么116 + 14 = -126(CS50)

时间:2017-05-13 15:48:19

标签: c cs50

我试图找出CS50的Vigenere问题集,而我没有得到我期待的东西。我写出了我在纸上使用的案例并手工完成了数学计算,当我运行程序时,我得到了完全不同的东西。它的添加和程序正在处理不包含在字母表中的值。我正在使用#bac;' bacon'并且用户收到的字符串将会“见面”。对于前3个字母“Mee”来说,该程序运行正常,但是当它达到'#39;它做得不太好......

程序通过查找转换为大写的参数的ASCII值来运行,在这种情况下它是' BACON'然后这些值用于递增相应的i' ;字符串中的值' Meet'。我的代码显示了增加字符串中第i个值的大小,以及字符串中第i个字符的值。我不完全确定我做错了什么。任何帮助或提示将不胜感激!

P.S。这个问题涉及最后的问题,如果'在最后一个for循环中有条件的。

    #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);

    }

1 个答案:

答案 0 :(得分:3)

您的程序正在使用signed char变量,其范围从-128到+127,并且您遇到整数溢出。