2014-02-20 5 views
0

괜찮 았어.이게 거의 ​​옳지 만 키 주위에 대문자가있는 경우 텍스트가 돌아 다니지 않을거야. -/모든 힌트 나 단서가 놀랍다. size_of_the_key bcz. 내가 본 모든 것을 strlen이라고 본 적이 없다.Vigenere Cipher. size_of_the_key

#define LMIN 97 
#define LMAX 122 
#define UMIN 65 
#define UMAX 90 
#define ALPHANUM 25 
int main(int argc, string argv[]) 
{ 
int i, j, n; 

string pt = GetString(); 
string key = argv[1]; 

for(i = 0, j = 0, n = strlen(pt); i < n; i++, j++) 
{ 

if(pt[i] >= LMIN||pt[i] == LMAX){ 

pt[i] = ((pt[i] - LMIN) + (key[j] - LMIN)) % 26; 

pt[i] += LMIN; 

printf("%c", pt[i]); 
} 

else if (pt[i] >= UMIN||pt[i] == UMAX){ 

pt[i] = ((pt[i] - UMIN) + (key[j] - UMIN)) % 26; 

pt[i] += UMIN; 

printf("%c",pt[i]); 

} else{ 
printf("%c", pt[i]); 
}   
} 
} 
+0

저에게 일반적인 변수처럼 보입니까? 그러나 실제로이 질문은 완전한 소스를 가지지 않고서는 대답하기가 불가능합니다 (아마도 당신처럼). 당신은 단순히'size_of_the_key' 정의를위한 소스를 검색해야합니다. –

답변

0

Vigenère cipher의 작동 방식에 익숙하다고 가정합니다. 키 구는 일반 텍스트보다 짧을 때 문자가 같은 길이의 문자열을 만들 때까지 반복되어 시저 문자 이동이 각 일반 텍스트에 대해 계산됩니다.

C 코드에서 key[k % size_of_the_key]은 증분 변수 k을 사용하여 키 구의 각 부분에 차례로 액세스합니다. modulus operator (%)은 k이 키 구의 길이를 초과하여 증가 할 때 문자가 필요한만큼 반복되도록합니다.

독자적인 프로그램을 작성하는 경우 strlen()에 간단한 호출을 사용하여 주요 구의 길이를 얻을 수 있습니다. 그러나 게시 한 코드에서 핵심 구문은 0에서 25 (key[]) 사이의 값 배열로 변환되어야합니다.

또한 대문자와 소문자로 코드를 작성해야합니다. 대문자를 현재 형태로만 변환하는 것처럼 보입니다.

0

음,

  • 텍스트의 길이가 더 긴 후 거의 항상 size_of_the_key 인 키의 길이입니다. 이것은 대부분의 암호에 유효합니다.

  • key[k % size_of_the_key] 당신이 키 값을 반복 유지 보장, 그래서 텍스트가 6 길고 키가 4 긴 경우, 당신은 k % size_of_the_key에 따라 루프

의 값 0,1,2,3,0,1을 가지고해야합니다 덧글,

  • 변수 k을 제거하고 직접 j을 사용할 수도 있습니다.

  • strlen()은 키의 크기를 평가할 때 키가 null 문자를 쉽게 포함 할 수 있으므로 사용하지 마십시오.

+0

strlen을 사용하지 않으면 텍스트와 함께 각 문자를 어떻게 읽습니까? 만약 text % [i] + k [j] % 26 내가 그것을 올바르게 얻기 시작하지만 여전히 mod %를 사용하여 텍스트 주위에 키를 감싸는 방법을 이해하지 못한다면 그것은 텍스트일까요? % argv [1] [i] if i = 0; 그렇다면 int like c = argv [1] [i]; 다음 C++; 이 모든 것을 for 루프 내에서 – immatryitout

+0

변경 사항을 다시 편집하고 다른 질문을 할 수 있습니까? 이 게시물은 매우 지저분 해지고 있습니다 .. – gg349