CS50의 Vigenere 문제 세트를 알아 내려고하는데 내가 기대하는 바를 얻지 못합니다. 나는 종이에 사용한 사례를 작성하고 손으로 수학을했고 프로그램을 실행하면 완전히 다른 것을 얻었습니다. 덧셈이고 프로그램은 알파벳을 감싸지 않는 값에 대해 작동합니다. 저는 '베이컨'인수를 사용하고 있으며 사용자가받은 문자열은 '만남'이 될 것입니다. 프로그램은 처음 세 글자 '미'에 대해 잘 실행되지만 't'에 도달하면 너무 잘 작동하지 않습니다.
프로그램은 대문자로 변환 된 인수의 ASCII 값 (이 경우 'BACON')을 찾아서 실행되며,이 값은 문자열 'Meet'에서 해당 i 번째 값을 증가시키는 데 사용됩니다. 내 코드는 문자열의 i 번째 값과 문자열의 i 번째 문자 값을 얼마나 증가시킬 것인지 보여주었습니다. 나는 내가 뭘 잘못하고 있는지 완전히 확신하지 못합니다. 어떤 도움이나 팁이라도 대단히 감사하겠습니다!
추신 :이 문제는 마지막 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 변수를 사용하고 있으며 정수 오버플로가 발생합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다