2

こんにちは、数字の文字列を整数に変換する際に問題があります。問題は、atoi() を使用して文字列を整数に変換すると、先頭のゼロが失われることです。先頭のゼロを失うことなくそれを行う方法を教えてください。

#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>


using namespace std;

struct Book{
    int id;
    string title;
};

struct Author{
    string firstName; 
    string lastName;
};

Author authorInfo[200];
Book bookInfo[200];

void load ( void )
{

    int count = 0;
    string temp;

    ifstream fin;
    fin.open("myfile.txt");

    if (!fin.is_open())
    {
        cout << "Unable to open myfile.txt file\n";
        exit(1);
    }

    while (fin.good())
    {   
        getline(fin, temp, '#');
        bookInfo[count].id = atoi(temp.c_str());
        getline(fin, bookInfo[count].title, '#');
        getline(fin, authorInfo[count].firstName, '#');
        getline(fin, authorInfo[count].lastName, '#');
        count++;
    }

    fin.close(); 
}
4

7 に答える 7

3

整数には先行ゼロがありません。あるいは、もっと正確に言えば、ゼロから無限の数があります。数値 42、042、および 000000042 (先頭0が異なる基数を示すソース コードを除く) はすべて 42 です。

先頭のゼロを保持したい場合は、文字列のままにするか、元の文字列の大きさに関する情報をどこかに保存してください。このようなものは良いスタートです:

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdio>
#include <cstdlib>

int main (void) {
    // Test data.

    const char *sval = "0042";

    // Get original size.

    int size = strlen (sval);

    // Convert to int (without leading 0s).
    // strtol would be better for detecting bad numbers.

    int ival = atoi (sval);

    // Output details.

    std::cout << sval << " has size of " << size << ".\n";
    std::cout << "Integer value is " << ival << ".\n";
    std::cout << "Recovered value is " << std::setw(size)
        << std::setfill('0') << ival << ".\n";

    return 0;
}

出力:

0042 has size of 4.
Integer value is 42.
Recovered value is 0042.
于 2013-06-27T00:47:44.813 に答える
2

数字に「先行ゼロ」というものはありません。「先頭のゼロ」は、数値の 10 進 ASCII 表現など、特定の表記法のプロパティです。その表記法を概念的に抽象的な数値表現に変換すると、「先行ゼロの数」などのメトリックは適用できなくなります (少なくとも 10 進数では)。跡形もなく失われています。

数は数です。先行またはその他の「ゼロ」はありません。

あなたができる唯一のことは、元の表記法にあった先頭のゼロの数 (またはフィールドの幅) を記憶し、後で数値を 10 進 ASCII 表現に戻すときに、適切な数値を再作成することです。その保存された情報を使用して先行ゼロの。

ところで、あなたの場合、入力番号が事前に定義されたフォーマット (先行ゼロなど) を持つ本の ID を表す場合、別のアプローチを検討することができます: 本 ID を に変換しないでくださいint。文字列として保持します。書籍の ID に対して算術演算を実行する必要があるわけではありませんね。ほとんどの場合、必要なのは、文字列に対して実行できるリレーショナル比較と等価比較だけです。

于 2013-06-27T01:33:11.680 に答える
2

A = strlen(string)文字列の文字数を返します(先行ゼロを含む桁数など)

B = log10(atoi(string)) + 1あなたの番号の桁数を返します

A - B =>先行ゼロの数。

これで、必要に応じてそれらをフォーマットできます。

于 2013-06-27T00:50:02.190 に答える
1

先月、このタイプの問題に遭遇しました!

Class CString が提供する Format() メソッドを使用できると思います。 CString::Format()一連の文字と値をフォーマットして CString に格納します。オプションの各引数 (存在する場合) は、対応する pszFormat のフォーマット仕様に従って、または nFormatID によって識別される文字列リソースから変換され、出力されます。例えば:

CString m_NodeName;
m_NodeName.Format(_T("%.4d"),Recv[2]*100+Recv[3]);
// %.4d means the argument will be formatted as an integer, 
// 4 digits wide, with unused digits filled with leading zeroes

詳細については、http: //msdn.microsoft.com/zh-cn/library/18he3sk6 (v=vs.100).aspx を参照してください。

于 2013-06-27T01:26:07.833 に答える
0

int先頭に 0 を付けてを格納する方法はありません。

代わりにやりたいことは、あなたのclassためにやってもらうことです:

 class intWithLeadingZeros {
       int number;
       int numberOfLeadingZeros;

       intWithLeadingZeros( string val )
       {
          // trivial code to break down string into zeros and number
       }

       string toString() {
            // trivial code that concatenates leading 0s and number
       }



 };
于 2013-06-27T00:50:18.040 に答える