1

ブロック転置暗号プログラムを作成する課題があります。ユーザーが選択したフレーズを入力すると、プログラムはそのフレーズからスペース、句読点を取り除き、小文字を作成してから、その長さを読み取り、すべての文字列に適合する最も近い正方形のサイズの 2 次元配列を作成します。変更された文字列の chars を変更し、残りのスペースをランダムな文字で埋めます。

問題は、その正方形の作成に問題があることです。

私はこれまでのところこれを持っています:

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 */
}

何か案は?

(私はすでに突然変異部分を行っています;代替コードでテストされています)

4

3 に答える 3

2

あなたは例えばすることはできません

char * original = new char[][];

まず最初に、配列の配列(またはポインターのポインター)を作成し、それを単一のポインターに割り当てようとしています。あなたは2つのステップでそれをする必要があります:

  1. 「外部」配列を割り当てます。

    char **original = new char* [size];
    
  2. 「内部」文字列を割り当てます。

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

ただし、これは使用しないことを強くお勧めします。std::vector代わりに、ヒープに割り当てられた「配列」の代わりに使用する必要があります。内容が文字列の場合は、次を使用しstd::stringます。

std::vector< std::vector< std::string > > original;
于 2012-11-09T06:12:29.537 に答える
0

長さの平方根を取り、切り捨てて整数にし、1 を足して新しい長さを得ることができます。

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

次に、通常どおりにmalloc正方形を使用して塗りつぶします。len

于 2012-11-09T05:33:59.310 に答える
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;
  }
}

これにより、その場で転置が行われます。文字を格納するために別の配列は必要ありません。

于 2012-11-09T07:16:50.517 に答える