Я нахожу String :: copy довольно трудным: скопировать первые пять символов строки - PullRequest
0 голосов
/ 10 января 2011

Я пытаюсь научить себя программировать, поэтому заранее прошу прощения за плохой код или плохую практику. По сути, я пытаюсь скопировать часть длинной строки, используя 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 ]

3 голосов
/ 10 января 2011

Я полагаю, вы неправильно прочитали документацию basic_string::copy. С этой страницы :

size_type copy( Char* s, size_type count, size_type index = 0 ) const;

Копирует количество символов с позиции, начиная с индекса до заданной строки символов s. Результирующая строка не заканчивается NULL.

Вы используете первый параметр правильно (buffer, будучи массивом символов, он будет затухать до указателя на символ при передаче аргумента функции), но ваш второй и третий аргументы не являются:

  • size_type count - количество копируемых символов: вы предоставляете 0, а вам кажется, что вы хотите 5
  • size_type index - начальный индекс для копирования символов: вы предоставляете 5, в то время как вам, очевидно, нужно 0 (скопируйте count символов с начала строки). Параметр по умолчанию имеет значение аргумента 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 без проблем. Другими словами: это намного безопаснее.

0 голосов
/ 10 января 2011

Функция-член substr была бы более традиционным решением этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...