小问题。使用以下字符串从文本文件转换的字符串:
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和下一个字母,依此类推到字符串的第二行。
感谢您的帮助!
答案 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++
。