0

ちょっとした質問です。以下を使用してテキストファイルから変換した文字列を使用します。

std::string content((std::istreambuf_iterator<char>(istr) ), 
                        (std::istreambuf_iterator<char>() ) );

印刷すると、次のようになります。

@....@........@......@....................@....@...............@..........@..@......
@....@..@@@...@......@.......@@@..........@....@..@@@....@@@...@..........@..@......
@@@@@@.@...@..@......@......@...@.........@....@.@...@..@......@.......@@@@..@......
@....@.@@@@...@......@......@...@.........@....@.@...@..@......@......@...@..@......
@....@.@......@......@......@...@.........@.@@.@.@...@..@......@......@...@.........
@....@..@@@@...@@.....@@.....@@@...........@..@...@@@...@.......@@.....@@@@..@......
....................................................................................

それでも、ここでこのコードを使用すると:

    for (int i = 0; i < (content.length()-6); i++){
        std::string w = content.substr(i, 6);
        std::cout << w << '\n';
    }

必要に応じて多くの部分文字列を取得しましたが、期待どおりに見えません。私の意図は、次のようなものにすることです(最初の行の例として):

@....@
......
..@...
...@..
......
......
......
@....@
......
......
...@..
......
..@..@
......

代わりに、次の行に沿って取得します。

@....@
....@.
...@..
..@...
.@....
@.....
......
......
......
.....@
....@.
...@..
..@...
.@....

なぜこれができるのかわかりませんが、おそらく substr がしないことをしていると思いますか? 最初の行の最初の 6 文字を取得したいだけで、次の 6 文字、次の 6 文字というように、文字列の 2 行目に続きます。

助けてくれてありがとう!

4

2 に答える 2

5

私は実際にはC ++を知りませんが、部分文字列(0, 5)、次に(1, 6)、次に(2, 7)などを作成しているように見えます。部分文字列(0, 5)を作成しようとすると、 (6, 11) 次に (12, 17)。

i毎回 1 ではなく 6ずつ増やしてみてください。したがって、新しいコードは次のようになります

for (int i = 0; i < (content.length()-6); i += 6){
        std::string w = content.substr(i, 6);
        std::cout << w << '\n';
    }

あなたの例でシフトされている @ は、毎回同じ @ です。これは、1 文字ずつ蛇行しているだけだからです。

于 2013-01-31T22:08:33.370 に答える
1

forループi += 6の代わりに試してください。i++

于 2013-01-31T22:08:53.530 に答える