1

文字列を2次元配列に変換する方法を知っている人はいますか? これは私の試みでした:

string w;
char s[9][9];
int p=0;
getline(cin, w);
while(p != w.size())
{
  for (int k = 0; k < 9; k++)
  {
    for(int j = 0; j < 9; j++)
    {
      s[k][j] = w[p];
      p++;
    }
  }
}
  cout << "nums are: " << endl;
  for(int k = 0; k < 9; k++)
  {
    for(int j = 0; j <9; j++)
    {
      cout << s[k][j];
    }
  }

しかし、数字は正しく印刷されません。s[k][j] で w のすべてを出力したいのですが、意味不明な出力をするだけです。また、string[81] を実行すると、大量のエラーが発生することにも気付きました。誰でも私を助けることができますか?ありがとう。

4

2 に答える 2

1

これを試して:

const int NUM_ROWS = 9;
const int NUM_COLS = 9;

string w;
char s[NUM_ROWS][NUM_COLS];

getline(cin, w);

if (w.size() != (NUM_ROWS * NUM_COLS))
{
    cerr << "Error! Size is " << w.size() << " rather than " << (NUM_ROWS * NUM_COLS) << endl;
    exit(1);
}

for (int count = 0; count < w.size(); count++)
{
    if (!isdigit(w[count]) && w[count] != '.')
    {
        cerr << "The character at " << count << " is not a number!" << endl;
    }
}

for (int row = 0; row < NUM_ROWS; row++)
{
    for(int col = 0; col < NUM_COLS; col++)
    {
        s[row][col] = w[col + (row * NUM_COLS)];
    }
}

cout << "Nums are: " << endl;

for(int row = 0; row < NUM_ROWS; row++)
{
    for(int col = 0; col < NUM_COLS; col++)
    {
        cout << s[row][col] << " ";
    }

    cout << endl;
}

私たちのチャットに基づいて、これが欲しいかもしれません:

const int NUM_ROWS = 9;
const int NUM_COLS = 9;

string w;
char s[NUM_ROWS][NUM_COLS];

while (!cin.eof())
{
    bool bad_input = false;

    getline(cin, w);

    if (w.size() != (NUM_ROWS * NUM_COLS))
    {
        cerr << "Error! Size is " << w.size() << " rather than " << (NUM_ROWS * NUM_COLS) << endl;
        continue;
    }

    for (int count = 0; count < w.size(); count++)
    {
        if (!isdigit(w[count]) && w[count] != '.')
        {
            cerr << "The character at " << count << " is not a number!" << endl;
            bad_input = true;
            break;
        }
    }

    if (bad_input)
        continue;

    for (int row = 0; row < NUM_ROWS; row++)
    {
        for(int col = 0; col < NUM_COLS; col++)
        {
            s[row][col] = w[col + (row * NUM_COLS)];
        }
    }

    cout << "Nums are: " << endl;

    for(int row = 0; row < NUM_ROWS; row++)
    {
        for(int col = 0; col < NUM_COLS; col++)
        {
            cout << s[row][col] << " ";
        }

        cout << endl;
    }
}
于 2012-10-20T21:27:47.240 に答える
0

あなたは何をしようとしているのかをうまく説明しておらず、直面している問題についても説明していないので、以下は推測に基づいています。

だから、あなたがやろうとしているのは、次のような文字列を取ることです:

素早い茶色のキツネは、怠け者の犬を飛び越えました。

そして、それを次のような 2D 配列に入れます。

  0 1 2 3 4 5 6 7 8
0 T h e   q u i c k
1   b r o w n   f o
2 x   j u m p e d  
3 o v e r   t h e  
4 l a z y   d o g s
5 . x x x x x x x x
6 x x x x x x x x x
7 x x x x x x x x x
8 x x x x x x x x x

コードの 1 つの問題は、値を からwにコピーするときに、インデックスが実際に境界内にあるsことを保証しないことです。;pという行でこれに対処しようとしたようです。しかし、それは外側のループであり、範囲外にインクリメントされて内側のループで使用されることをwhile(p != w.size())防ぎます。p代わりにp++; if (p==w.size()) break;、インクリメントする最も内側のループ内に次のようなものを配置する必要がありますp。または、さらに良いことに、配列ではなく文字列を反復処理する必要があります。次の擬似コードのようなものはwhile(p){for(k){for(j){}}}、ループのセット全体を置き換えます.:

for(size_t i=0; i<w.size(); ++i) {
    int k = compute target row from i
    int j = compute target column from i
    s[k][j] = w[i]
}

また、デバッグ中に配列をよりよく視覚化するためのコードを次に示します。

#include <iostream>

int main() {
    char s[9][9] = {"The","quick","brown","fox","jumped","over","the","lazy","dogs."};

    // your code to get input and copy it into the array goes here
    //
    // for(size_t i=0; i<w.size(); ++i) {
    //     int k = compute target row from i
    //     int j = compute target column from i
    //     s[k][j] = w[i]
    // }

    std::cout << "  0 1 2 3 4 5 6 7 8\n";
    for (int i=0; i<9; ++i) {
        std::cout << i;
        for (int j=0; j<9; ++j)
            std::cout << ' ' << s[i][j];
        std::cout << '\n';
    }
}

このプログラムを何も変更せずに実行すると、出力は次のようになります。

  0 1 2 3 4 5 6 7 8
0 T h e      
1 q u i c k    
2 b r o w n    
3 f o x      
4 j u m p e d   
5 o v e r     
6 t h e      
7 l a z y     
8 d o g s .    
于 2012-10-20T21:33:43.387 に答える