String C++ ke int tanpa menggunakan atoi() atau stoi() [duplikat]

Hai, saya baru mengenal C++ dan mencoba mengerjakan tugas di mana kami membaca banyak data dari file txt dalam format

 surname,initial,number1,number2

Saya meminta bantuan sebelum seseorang menyarankan membaca 2 nilai sebagai string kemudian menggunakan stoi() atau atoi() untuk mengonversi ke int. Ini berfungsi dengan baik, kecuali saya perlu menggunakan parameter ini "-std=c++11" untuk kompilasi atau akan menghasilkan kesalahan. Ini bukan masalah pada komputer saya sendiri yang akan menangani "-std=c++11", tapi sayangnya bagi saya mesin tempat saya harus mempresentasikan program saya tidak memiliki opsi ini.

Jika ada cara lain untuk mengubah string menjadi int yang tidak menggunakan stoi atau atoi?

Ini kode saya sejauh ini.

while (getline(inputFile, line))
{
    stringstream linestream(line);

    getline(linestream, Surname, ',');
    getline(linestream, Initial, ',');
    getline(linestream, strnum1, ',');
    getline(linestream, strnum2, ',');
    number1 = stoi(strnum1);
    number2 = stoi(strnum2);

    dosomethingwith(Surname, Initial, number1, number2);
}

person user2661167    schedule 11.10.2013    source sumber
comment
Pertama, Anda tidak memerlukan -std=c++11 untuk atoi. Tapi saya akan menghindari atoi, karena tidak mengizinkan pemeriksaan kesalahan apa pun. Solusi yang lebih baik adalah strtoi.   -  person James Kanze    schedule 11.10.2013
comment
Dan apa maksudnya mania menggunakan stringstream, padahal yang diinginkan adalah istringstream? (Saya melihatnya sepanjang waktu, dan saya tidak mengerti mengapa ada orang yang melakukannya.)   -  person James Kanze    schedule 11.10.2013
comment
Selain itu, alih-alih istringstream, untuk format semacam ini, saya akan menggunakan sesuatu seperti boost::split (yang masih menyisakan masalah konversi ke int terbuka).   -  person James Kanze    schedule 11.10.2013


Jawaban (2)


Saya pikir Anda bisa menulis fungsi stoi Anda sendiri. ini kode saya, saya sudah mengujinya, sangat sederhana.

long stoi(const char *s)
{
    long i;
    i = 0;
    while(*s >= '0' && *s <= '9')
    {
        i = i * 10 + (*s - '0');
        s++;
    }
    return i;
}
person wangyang    schedule 11.10.2013
comment
Pertama, dia tidak punya char const*, tapi std::string. Dan kedua, fungsi-fungsi seperti itu memerlukan lebih banyak pemeriksaan kesalahan agar dapat berguna. - person James Kanze; 11.10.2013

Anda sudah menggunakan stringstream, yang memberi Anda "fitur" seperti itu.

void func()
{
    std::string strnum1("1");
    std::string strnum2("2");
    int number1;
    int number2;
    std::stringstream convert;

    convert << strnum1;
    convert >> number1;

    convert.str(""); // clear the stringstream
    convert.clear(); // clear the state flags for another conversion

    convert << strnum2;
    convert >> number2;
}
person Mateusz KoƂodziejski    schedule 11.10.2013
comment
Mengapa menjadi sederhana ketika Anda bisa menjadi rumit? Anda tidak memerlukan (atau tentu menginginkan) stringstream dua arah. Cukup gunakan istringstream, diinisialisasi dengan string yang benar. - person James Kanze; 11.10.2013