2011-01-09 8 views
-4

私はプログラムを教えることを試みているので、コードや悪い習慣について事前にお詫びします。基本的には、string :: copyを使って長い文字列の一部をコピーしようとしていますが、明らかに何か正しいことをしていません。ここでの私の目標は、コピーして、文字列「なBigNumber」の最初の5つの文字を印刷することです:あなたが気にしている場合私は文字列::コピーを見つけるのがむしろ難しい:文字列の最初の5文字を​​コピーする

#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

"私はプログラムのために自分自身を教えようとしています" >>>落胆しないでくださいが、あなたはPython、PHP、Ruby、.netなどのような高水準言語(今のところ)でもっと幸せでしょう。 – gahooa

答えて

0

substrメンバ関数は、この問題のより従来的な解決方法です。

+0

ありがとう、私はそれをチェックします。 – Brian

3

basic_string::copyのドキュメントを誤解していると思います。 this pageから:

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

コピーが与えられた文字列sのインデックスから始まり、位置から文字を数えます。結果の文字列はNULLで終了しません。

最初のパラメータのご使用は正しいです

buffer char型の配列である、それは関数の引数の受け渡しの際にchar型のポインタに減衰する)が、2番目と3番目の引数はありません。

  • size_type countは、コピーする文字数です。あなたが望むように0を提供しています。5
  • size_type indexは、文字のコピーの開始インデックスです。明らかに0が必要ですが、文字列の先頭から文字)。パラメータのデフォルトの引数値は0です。ここに値を指定する必要はありません。
  • 最後に

、あなたが行うことができます:私はへの変更を反映せずにbufferサイズが変更された場合は、バグを導入することを避けるためにマジック値5ではなくsizeof(buffer)を使用しました

const size_t window = bignumber.copy(buffer, sizeof(buffer)); 

お知らせこの呼び出し。また、bufferは、NULL終了文字列ではないため、copyの呼び出し後にstd::coutに単純に出力できないことにも注意してください。


、唯一std::stringでの作業はオプション(ほとんどの場合、それがあるべき)、あなたにもbasic_string::substrを使用している可能性である場合:

basic_string substr(size_type index = 0, size_type count = npos) const; 

はの部分文字列を返します。指定された位置のインデックスから始まり、カウント文字の長さを持つ現在の文字列。例えば

copyソリューションへ

const std::string substring = bignumber.substr(0, 5); 

反して、ここには可能なサイズの問題はありません、その結果は何の問題もなくstd::coutに出力することができます。言い換えれば、もっと安全です。

+0

有益な回答ありがとうございます。 – Brian

関連する問題