2012-11-09 3 views
1

블록 전환 암호 프로그램을 만들기위한 지정이 있습니다. 사용자는 자신이 선택한 문구를 입력해야하며, 프로그램은 공백, 문장 부호를 제거하고 소문자로 만들고 길이를 읽은 다음 모든 문자에 맞게 가장 가까운 사각형의 크기를 2 차원 배열로 만듭니다. 돌연변이 된 문자열에있는 문자와 나머지 문자를 임의의 문자로 채 웁니다.C++ 사용자 입력 문자열 길이를 기반으로 2 차원 배열 만들기

문제는 그 사각형을 만드는 데 문제가 있습니다.

나는이 지금까지 가지고

int main() 
{ 
    string input; 
    cout << "Please enter message to cipher." << endl; 
    getline(cin, input); 

    /* do punctuation removal/mutation */ 

    int strLength = input.length(); //after mutation 

    /* need to find the square here before applying sizes and values to arrays */ 

    char * original = new char[][]; // sizes pending 
    char * transposed = new char[][]; // sizes pending 

    for (int i = 0; i <= /* size pending */ ; i++) 
    { 
     for (int j = 0; j <= /* size pending */ ; j++) 
     { 
      transposed[j][i] = original[i][j]; 
     } 
    } 

    /* do more stuff here */ 
} 

어떤 아이디어?

+0

'char ** original'이 아니겠습니까? – irrelephant

답변

0

당신은 정수까지, 라운드 길이의 제곱근을하고 새 길이를 얻기 위해 하나를 추가 할 수 있습니다

는 (다른 코드로 테스트를 이미 돌연변이 부분을 수행했다).

int len = (int)(sqrt(strLength) + 1e-9) + 1; 

당신은 다음과 len를 사용하여 사각형 평소대로 채울 것 malloc.

2

예를 들어 할 수 없습니다.

char * original = new char[][]; 

우선 배열 배열 (또는 포인터 포인터)을 만들고이를 단일 포인터에 할당하려고합니다. 당신은 두 단계를 수행해야합니다 내가

for (int i = 0; i < size; i++) 
    original[i] = new char [other_size]; 

하지만 :

char **original = new char* [size]; 
  • 는 "내부"문자열을 할당 :

    1. 는 "외부"배열을 할당 그것을 사용하여에 대해 을 강력히 추천합니다! 대신 대신 힙 할당 "배열"의 std::vector를 사용되어야하며, 내용이 문자열을 경우 다음 std::string를 사용

      std::vector< std::vector<std::string> > original; 
      
  • 0

    을 나는 당신이이 "새로운"스토리지를 만들 필요가 없습니다 생각합니다.

    char buf[size][size]; // size is a variable 
    ... // populate your buf 
    
    char tmp; 
    for(int i = 0; i < size; i++) { 
        for(int j = 0; j < i; j++) { 
        tmp = buf[i][j]; 
        buf[i][j] = buf[j][i]; 
        buf[j][i] = tmp; 
        } 
    } 
    

    이 자리에 전치을 수행합니다 다음 코드는 작업을해야한다. char를 저장하기 위해 다른 배열이 필요하지 않습니다.