我正在努力教自己编程,所以我提前为任何伪劣的代码或不良做法道歉。基本上,我正在尝试使用string :: copy复制长字符串的一部分,但我显然没有做正确的事情。我的目标是复制并打印字符串“bignumber”的前五个字符:
#include <iostream>
#include<string>
using namespace std;
int main()
{
const string bignumber = "73167176531330624919225119674426574742355349194934\
96983520312774506326239578318016984801869478851843\
85861560789112949495459501737958331952853208805511\
12540698747158523863050715693290963295227443043557\
6689664895044524452316173185640309871121722383113\
62229893423380308135336276614282806444486645238749\
30358907296290491560440772390713810515859307960866\
70172427121883998797908792274921901699720888093776\
65727333001053367881220235421809751254540594752243\
52584907711670556013604839586446706324415722155397\
53697817977846174064955149290862569321978468622482\
83972241375657056057490261407972968652414535100474\
82166370484403199890008895243450658541227588666881\
16427171479924442928230863465674813919123162824586\
17866458359124566529476545682848912883142607690042\
24219022671055626321111109370544217506941658960408\
07198403850962455444362981230987879927244284909188\
84580156166097919133875499200524063689912560717606\
05886116467109405077541002256983155200055935729725\
71636269561882670428252483600823257530420752963450";
int iter = 0;
size_t window;
char buffer[5];
window = bignumber.copy(buffer,iter,iter+5);
cout << window << endl;
return 0;
}
如果您关心,这是项目欧拉问题8。谢谢你的帮助。
答案 0 :(得分:3)
我相信你误读了basic_string::copy
的文档。来自this page:
size_type copy( Char* s, size_type count, size_type index = 0 ) const;
从位置开始复制计数字符,从索引开始到给定的字符串s。结果字符串不是NULL终止。
你对第一个参数的使用是正确的(buffer
是一个char数组,它会在函数参数传递时衰减为char指针),但你的第二个和第三个参数不是:
size_type count
是要复制的字符数:您提供0而您似乎想要5 size_type index
是字符复制的起始索引:当你显然需要0(从字符串的开头复制count
个字符时,你提供5)。该参数恰好具有默认参数值0:您不必在此提供任何值。最后,你可以这样做:
const size_t window = bignumber.copy(buffer, sizeof(buffer));
请注意,我使用sizeof(buffer)
而不是魔术值5来避免在buffer
大小发生更改时引入错误而不反映对此调用的修改。另请注意,在调用buffer
后,std::cout
无法简单地输出到copy
,因为它不是以空字符结尾的字符串。
现在,如果仅使用std::string
是一个选项(在大多数情况下应该是这样),您也可以使用basic_string::substr
:
basic_string substr( size_type index = 0, size_type count = npos ) const;
返回当前字符串的子字符串,从给定的位置索引开始,并具有计数字符的长度。
例如:
const std::string substring = bignumber.substr(0, 5);
与copy
解决方案相反,此处没有可能的大小问题,结果可以毫无问题地输出到std::cout
。换句话说:它更安全。
答案 1 :(得分:0)
substr成员函数将是解决此问题的更常规方法。