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,然后是下一个,依此类推,继续到字符串的第二行。

谢谢您的帮助!

4

2 回答 2

5

我实际上并不了解 C++,但是当您尝试制作子字符串 (0, 5) 然后是 (1, 6) 然后是 (2, 7) 等时,看起来您正在制作子字符串(6, 11) 然后 (12, 17)。

尝试i每次增加 6 而不是 1。所以新的代码是

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

在您的示例中被转移的 @ 每次都是相同的 @,因为您只是在移动一个字符。

于 2013-01-31T22:08:33.370 回答
1

尝试i += 6而不是i++在你的 for 循环中。

于 2013-01-31T22:08:53.530 回答