2017-10-01 4 views
-1

인쇄 가능한 전체 ASCII 문자 집합을 사용하는 코드를 만들려고합니다. 내 문제는 126보다 높은 숫자가 될 문자가 '?'인데 'r'을 제외하고 제대로 인쇄된다는 것입니다. 왜 내 코드는 'r'이 인쇄 가능한 문자로 롤백 할 수 있지만 그 이후의 문자는 롤백 할 수 없게합니까? (stuvwxyz {|} ~)ROT-13 전체 인쇄 가능한 ASCII 문자 집합 사용 C++

"비밀번호를 입력하십시오

ABCDEFGHIJKLMNOPQRSTUVWXYZ. {|} ~

nopqrstuvwxyz {|}을! ~ ????????????"

#include <iostream> 
#include <string> 
using namespace std; 

void encrypt(string password) 
{ 

int count = 0; 
char i; 

    for (count = 0; count < password.length(); count++) 
    { 
     i = password.at(count) + 13; 
      if (i >= 127) 
       { 
        i = 32 + (i - 126); 
        cout << i; 
       } 
      else 
       cout << i;   
    } 
    return; 
} 

int main() 
{ 
    string password; 

    cout << "Please enter your password." << endl; 
    cin >> password; 

    encrypt(password); 
    cout << "\n"; 
    return 0; 
} 
+2

은 "내 문제는 문자에 올 때 그들이 '로 인쇄 (126)보다 수가 더 높을 것이다 (예를 'y' -> 'J' -> 'y' -> 'J' -> ... 얼마나 통지) ? ', "- 이러한 숫자는 ASCII 문자 집합의 일부가 아니기 때문입니다. –

+0

BTW, ** 디버거 **를 사용한다면,'i'의 값은'+ 128 '이 아닌''s "'에 대해'-128'이라고 보았을 것입니다. ... 그래서 다음에, 게시하기 전에, 먼저 디버깅을 시도하십시오. – Ped7g

답변

0

대상 플랫폼이 char로 서명되었으므로 char의 유효한 값은 -128 .. +127입니다.

따라서 if (i >= 127)은 이 +128이 아니라 +128 인 경우 'r' (값 114) 만 포함합니다. 그리고 iffalse이고 -128 char 값을 출력합니다.

한 가지 빠른 해결 방법은 으로 unsigned char을 범위 +0 .. +255에서 작동하도록 선언하는 것입니다. 유효한 ASCII 7b 입력 만 지원하면 모든 +13 산술을 올바르게 처리 할 수 ​​있습니다.

32 + (i - 126);도 왜 r! (33)으로 변환 할 것인지 묻는 것입니다. 인쇄 할 수있는 ASCII 문자는 공백 (32)입니다. 이러한 수정 사항을 적용하고, 코드 (스타일 ++ C 방향으로) 조금 단순화, 내가 함께 끝났다 그래서 후

:

입력 + 출력 ( 'r' 지금 ' '에 매핑) 수행
void encrypt(const string & password) 
{ 
    for (unsigned char charToRot13 : password) { 
     charToRot13 += 13; 
     if (127 <= charToRot13) charToRot13 -= (127 - ' '); 
     cout << charToRot13; 
    } 
} 

:

Please enter your password. 
abcopqrstuvw 
nop|}~ !"#$% 

그러나. 주요 ROT13 기능은 동일한 작업으로 텍스트를 암호화하고 해독 할 수 있다는 것입니다. 나는. "abc"-> "nop"-> "abc"-> "nop"-> ...

전체 ASCII 범위로 변환하면 해당 기능이 중단됩니다. 그래서 당신이 원하는 것은 전체 +32 .. +126 ASCII 값의 범위를 포함하는 것입니다. 그것들은 95 개입니다. 95/2 = 47.5, 좋지 않다. 공간을 없애자. 왜냐하면 이미 그걸 -126에 의해했기 때문에, 아마도 그것을 원하지 않을 것이다. 암호화 할 값 범위는 +33 .. +126 = 94 개입니다. 94/2 = 47, 좋다. ROT47과 유사한 ASCII 범위 (공간 제외)를 얻기 위해 ROT47을 사용할 수 있습니다.

void encrypt(const string & password) 
{ 
    for (unsigned char charToRot47 : password) { 
     if (charToRot47 < 33 || 126 < charToRot47) { 
      cout << "\nERROR: detected invalid character.\n"; 
      break; 
     } 
     charToRot47 += 47; 
     if (126 < charToRot47) charToRot47 -= 94; 
     cout << charToRot47; 
    } 
} 

이 의지 출력 :

Please enter your password. 
xyz{|}~!"#$%000000IJKLMNOPQRST 
IJKLMNOPQRST______xyz{|}~!"#$% 

+0

그리고 텍스트 설명에서 "마법 상수"로만 작동하도록 최종 코드를 정리했습니다. 유효 범위는 33..126이고, 덮여있는 문자 수는 94이고, 94/2 = 47입니다. 갑자기 127과 비슷한 마법 번호를 사용하면 ROT47과 직접적인 관련이 없으며 실제로 ROT47 정의의 값만 사용하여 깨끗하게 작성할 수 있습니다. – Ped7g