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

Not understanding why 116+14 = -126 (CS50)

我正在尝试找出 CS50 的 Vigenere 问题集,但没有得到我期望的结果。我在纸上写下了我使用的案例并手工计算,当我 运行 程序时,我得到了完全不同的东西。它是加法,程序正在处理不环绕字母表的值。我正在使用参数 'bacon',用户收到的字符串将是 'Meet'。该程序 运行 前 3 个字母 'Mee' 没问题,但当它达到 't' 时就不太好用了...

程序运行s通过查找转换为大写的参数的ASCII值,在本例中为'BACON',然后这些值用于递增相应的第i个字符串 'Meet' 中的值。我让我的代码显示了它将增加多少字符串中的第 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);

    }

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