子串输出不如预期?

时间:2013-01-31 22:04:11

标签: c++ string algorithm substring

小问题。使用以下字符串从文本文件转换的字符串:

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和下一个字母,依此类推到字符串的第二行。

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

我实际上并不知道C ++,但是当你试图制作子串时,看起来你正在制作子串(0,5)然后是(1,6)然后是(2,7)等等。(0, 5)然后(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';
    }

在你的例子中被转移的@每次都是相同的@,因为你只是徘徊了一个角色。

答案 1 :(得分:1)

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