สตริง C ++ เป็น int โดยไม่ใช้ atoi() หรือ stoi() [ซ้ำกัน]

สวัสดี ฉันยังใหม่กับภาษา C++ และกำลังพยายามทำงานที่เราอ่านข้อมูลจำนวนมากจากไฟล์ txt ในรูปแบบ

 surname,initial,number1,number2

ฉันขอความช่วยเหลือก่อนที่จะมีคนแนะนำให้อ่านค่า 2 ค่าเป็นสตริง จากนั้นใช้ stoi() หรือ atoi() เพื่อแปลงเป็น int ใช้งานได้ดียกเว้นฉันต้องใช้พารามิเตอร์นี้ "-std=c++11" สำหรับการคอมไพล์ ไม่เช่นนั้นจะส่งกลับข้อผิดพลาด นี่ไม่ใช่ปัญหาในคอมพิวเตอร์ของฉันเองซึ่งจะจัดการ "-std=c++11" แต่น่าเสียดายสำหรับฉัน เครื่องที่ฉันต้องใช้แสดงโปรแกรมไม่มีตัวเลือกนี้

หากมีวิธีอื่นที่ฉันสามารถแปลงสตริงเป็น int ที่ไม่ใช้ stoi หรือ atoi ได้

นี่คือรหัสของฉันจนถึงตอนนี้

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 แหล่งที่มา
comment
ขั้นแรก คุณไม่จำเป็นต้องใช้ -std=c++11 สำหรับ atoi แต่ฉันจะหลีกเลี่ยง atoi เนื่องจากไม่อนุญาตให้ตรวจสอบข้อผิดพลาดใดๆ ทางออกที่ดีกว่าคือ strtoi   -  person James Kanze    schedule 11.10.2013
comment
และความคลั่งไคล้ในการใช้ stringstream คืออะไร ในเมื่อสิ่งที่คุณต้องการคือ istringstream? (ฉันเห็นมันตลอดเวลาและฉันไม่เข้าใจว่าทำไมใคร ๆ ถึงทำอย่างนั้น)   -  person James Kanze    schedule 11.10.2013
comment
นอกจากนี้ แทนที่จะเป็น istringstream สำหรับรูปแบบประเภทนี้ ฉันจะใช้บางอย่างเช่น boost::split (ซึ่งยังคงทิ้งปัญหาในการแปลงเป็น int เปิดอยู่)   -  person James Kanze    schedule 11.10.2013


คำตอบ (2)


ฉันคิดว่าคุณสามารถเขียนฟังก์ชัน stoi ของคุณเองได้ นี่คือรหัสของฉัน ฉันทดสอบแล้ว มันง่ายมาก

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
ประการแรก เขาไม่มี char const* แต่มี std::string และประการที่สอง ฟังก์ชันดังกล่าวจำเป็นต้องตรวจสอบข้อผิดพลาดมากขึ้นว่าฟังก์ชันเหล่านั้นจะมีประโยชน์หรือไม่ - person James Kanze; 11.10.2013

คุณกำลังใช้ stringstream อยู่แล้วซึ่งให้ "คุณสมบัติ" ดังกล่าวแก่คุณ

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
ทำไมต้องเป็นคนง่ายๆ ในเมื่อคุณสามารถซับซ้อนได้? คุณไม่จำเป็นต้อง (หรือไม่ต้องการ) แบบสองทิศทาง stringstream เพียงใช้ istringstream โดยเริ่มต้นด้วยสตริงที่ถูกต้อง - person James Kanze; 11.10.2013