不明白为什么 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 变量,并且您遇到了整数溢出。
我正在尝试找出 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 变量,并且您遇到了整数溢出。