我发现String :: copy相当困难:复制一个字符串的前五个字符

时间:2011-01-09 23:09:40

标签: c++ string

我正在努力教自己编程,所以我提前为任何伪劣的代码或不良做法道歉。基本上,我正在尝试使用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。谢谢你的帮助。

2 个答案:

答案 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成员函数将是解决此问题的更常规方法。