-2
#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>
#include <stdio.h>
#include <string>
#include <stdlib.h>
using namespace std;

int main()
{
    ostringstream str;
    double num = pow(2,1000);
    int sum = 0;

    str << setprecision(1000) << num;
    string here = str.str();

    cout << here << "\n\n";

    /*for(int i = 0; i < here.length(); i++)
    {
        sum += atoi(&here[i]);
    }*/

    cout << atoi(&here[0]);
    cout << atoi(&here[1]);
    cout << atoi(&here[2]);
}

出力:

10715086071862673209484250490600018105614048117055336074437503883703510511249361
22493198378815695858127594672917553146825187145285692314043598457757469857480393
45677748242309854210746050623711418779541821530464749835819412673987675591655439
46077062914571196477686542167660429831652624386837205668069376

000

なぜすべて0ですか?

4

4 に答える 4

4

これが、std::atoiがエラーを示す方法です。この場合、エラーは、配列内の数値が可能な最大の整数よりも大きいことです(これは、技術的には未定義の動作ですがatoi、実装では明らかに他のエラーとして扱われます)

于 2013-03-03T06:14:28.580 に答える
4

ここで手足に出て、実際には使いたくないと仮定しますstd::atoi。文字列内のすべての桁を合計する場合は、桁の文字をその桁のに変換します。これを行う最も簡単な方法は、文字定数を減算すること'0'です。ループでは、次を使用するだけです。

for(int i = 0; i < here.length(); i++)
{
    sum += here[i] - '0';
}

これが可能'0'なのは、文字列内のさまざまな文字からを減算すると、その文字が表す数値が得られるためです。

'0' - '0' == 0
'1' - '0' == 1
'2' - '0' == 2
//etc
'9' - '0' == 9

私が覚えている限り、C ++標準は特定のエンコードを強制しませんが、数字の文字が連続している必要があることを指定しているため、文字列に数字のみが含まれている場合は上記は安全ですが、文字列は結果を破棄します:

'E' - '0' == ???
'.' - '0' == ???
'+' - '0' == ???
于 2013-03-03T06:23:18.633 に答える
3

atoi文字列を整数に変換します(プラットフォームではおそらく32ビットまたは64ビット)。

保存した数値hereはより大きいためINT_MAXatoiゼロを返します。

成功すると、関数は変換された整数をint値として返します。有効な変換を実行できなかった場合は、ゼロ値が返されます。

編集:実際には、私自身のリンクを十分に注意深く読んでいませんでした、明らかにこの場合は未定義の動作です

変換された値がintで表現可能な値の範囲外になるとどうなるかについての標準仕様はありません。

www.cplusplus.comから

于 2013-03-03T06:15:01.670 に答える
0

' here[0] ' は、' here 'の最初の文字をcharとして返します。

「&here[0]」は、「here[0] 」のアドレスを返します。あなたはアドレスを望んでいません。「&」は変数のアドレスを取得するためのものです。

std::atoi(here[0])は、 hereの最初の文字をcharとして返し、そのcharintに変換します ... または、「atoi」が char を処理する場合はそうします。そうではありません-文字の配列を処理します。1 文字を指定すると、おそらくコンパイルされません。

std::atoi(&here[0])はコンパイルされますが、必要なものではありません。atoi は、ヌル文字に到達するまで文字を読み取り続けます。

これは、文字列「567321」が与えられたことを意味します。

  • std::atoi(&here[0]) は「987654321」を返します
  • std::atoi(&here 1 ) は「87654321」を返します
  • std::atoi(&here 2 ) は「7654321」を返します
  • std::atoi(&here[3]) は「654321」を返します
  • ... 等々。

本当にすべての数値を合計したい場合で、std::atoi() を使用する必要がある場合は、std::string::substr ()を使用して実行できます。

for(int i = 0; i < here.length(); i++)
{
    std::string subString = here.substr(i,1); //Returns a substring starting at 'i', and including 1 character 
    sum += atoi(subString.c_str());
}

より良い方法は、@dreamlax が投稿したメソッドを使用することです... しかし、文字列と std::atoi について学習している場合は、std::string::substr () について学習することが重要です。

C++11 を使用している場合は、std::stoiを使用して書き直します。

for(int i = 0; i < here.length(); i++)
{
    std::string subString = here.substr(i,1); //Returns a substring starting at 'i', and including 1 character 
    sum += std::stoi(subString);
}
于 2013-03-05T20:46:44.537 に答える