我试图找出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);
}
答案 0 :(得分:3)
您的程序正在使用signed char变量,其范围从-128到+127,并且您遇到整数溢出。