string - स्ट्रिंग को int C++में बदलें




(10)

atoi एक अंतर्निहित फ़ंक्शन है जो एक स्ट्रिंग को एक पूर्णांक में परिवर्तित करता है, यह मानते हुए कि स्ट्रिंग एक पूर्णांक प्रतिनिधित्व के साथ शुरू होती है।

cplusplus.com/reference/clibrary/cstdlib/atoi

इस प्रश्न का उत्तर यहां दिया गया है:

बस एक त्वरित सवाल है। मैंने इंटरनेट के चारों ओर बहुत कुछ देखा है और मुझे कुछ समाधान मिल गए हैं लेकिन उनमें से कोई भी अभी तक काम नहीं कर पाया है। एक स्ट्रिंग को एक int में कनवर्ट करना चाहते हैं और मेरा मतलब ASCII कोड नहीं है।

एक त्वरित रन-डाउन के लिए, हम एक स्ट्रिंग के रूप में समीकरण में पारित होते हैं। हम इसे तोड़ने, इसे सही ढंग से प्रारूपित करने और रैखिक समीकरणों को हल करने के लिए हैं। अब, यह कहकर, मैं एक स्ट्रिंग को एक int में परिवर्तित करने में सक्षम नहीं हूं।

मुझे पता है कि स्ट्रिंग या तो प्रारूप (-5) या (25) आदि में होगी, इसलिए यह निश्चित रूप से एक int है। लेकिन हम इसे एक स्ट्रिंग से कैसे निकाल सकते हैं?

एक तरीका मैं सोच रहा था कि स्ट्रिंग के माध्यम से लूप के लिए चल रहा है, एक अंक की जांच करें, उसके बाद सभी अंकों को निकालें और फिर देखें कि क्या कोई अग्रणी '-' है, यदि वहां है, तो int को गुणा करें - 1।

यद्यपि ऐसी छोटी समस्या के लिए जटिल लगता है। कोई विचार?


विंडोज़ में, आप इसका उपयोग कर सकते हैं:

const std::wstring hex = L"0x13";
const std::wstring dec = L"19";

int ret;
if (StrToIntEx(hex.c_str(), STIF_SUPPORT_HEX, &ret)) {
    std::cout << ret << "\n";
}
if (StrToIntEx(dec.c_str(), STIF_SUPPORT_HEX, &ret)) {
    std::cout << ret << "\n";
}

strtol , stringstream को आधार निर्दिष्ट करने की आवश्यकता है यदि आपको हेक्साडेसिमल की व्याख्या करने की आवश्यकता है।


माना जाता है कि मेरा समाधान नकारात्मक पूर्णांक के लिए काम नहीं करेगा, लेकिन यह इंटीग्रेट युक्त इनपुट टेक्स्ट से सभी सकारात्मक पूर्णांक निकाल देगा। यह numeric_only लोकेल का उपयोग करता है:

int main() {
        int num;
        std::cin.imbue(std::locale(std::locale(), new numeric_only()));
        while ( std::cin >> num)
             std::cout << num << std::endl;
        return 0;
}

इनपुट टेक्स्ट:

 the format (-5) or (25) etc... some text.. and then.. 7987...78hjh.hhjg9878

आउटपुट पूर्णांक:

 5
25
7987
78
9878

कक्षा numeric_only के रूप में परिभाषित किया गया है:

struct numeric_only: std::ctype<char> 
{
    numeric_only(): std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);

        std::fill(&rc['0'], &rc[':'], std::ctype_base::digit);
        return &rc[0];
    }
};

पूरा ऑनलाइन डेमो: http://ideone.com/dRWSj


Boost.Lexical_cast बारे में क्या?

यहां उनका उदाहरण दिया गया है:

निम्न उदाहरण कमांड लाइन तर्कों को संख्यात्मक डेटा के अनुक्रम के रूप में मानता है:

int main(int argc, char * argv[])
{
    using boost::lexical_cast;
    using boost::bad_lexical_cast;

    std::vector<short> args;

    while(*++argv)
    {
        try
        {
            args.push_back(lexical_cast<short>(*argv));
        }
        catch(bad_lexical_cast &)
        {
            args.push_back(0);
        }
    }
    ...
}

यह आमतौर पर काम करता है जब मैं इसका उपयोग करता हूं:

int myint = int::Parse(mystring);

स्ट्रिंग को एक पूर्णांक में बदलने के लिए atoi फ़ंक्शन का उपयोग करें:

string a = "25";

int b = atoi(a.c_str());

cplusplus.com/reference/clibrary/cstdlib/atoi


std::istringstream ss(thestring);
ss >> thevalue;

पूरी तरह से सही होने के लिए आप त्रुटि झंडे की जांच करना चाहेंगे।


यह शायद ओवरकिल का थोड़ा सा है, लेकिन boost::lexical_cast<int>( theString ) को बहुत अच्छी तरह से काम करना चाहिए।


एक और आसान तरीका है: मान लें कि आपके पास c='4' जैसे चरित्र हैं इसलिए आप इन चरणों में से एक कर सकते हैं:

पहला: int q

q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .

दूसरा तरीका:

q=c-'0'; the same , character '0' means 48


आप Matthieu एम द्वारा सुझाए गए अनुसार C ++ 11 में उपलब्ध std::to_string उपयोग कर सकते हैं:

std::to_string(42);

या, यदि प्रदर्शन महत्वपूर्ण है (उदाहरण के लिए, यदि आप बहुत सारे रूपांतरण करते हैं), तो आप एक पूर्णांक को std::string कनवर्ट करने के लिए C ++ प्रारूप लाइब्रेरी से fmt::FormatInt उपयोग कर सकते हैं:

fmt::FormatInt(42).str();

या एक सी स्ट्रिंग:

fmt::FormatInt f(42);
f.c_str();

उत्तरार्द्ध कोई गतिशील स्मृति आवंटन नहीं करता है और बूस्ट कर्म बेंचमार्क पर std::to_string से 10 गुना अधिक तेज़ है। अधिक जानकारी के लिए सी ++ में स्ट्रिंग रूपांतरण के लिए तेज़ पूर्णांक देखें।

std::to_string विपरीत, fmt::FormatInt को C ++ 11 की आवश्यकता नहीं है और किसी भी C ++ कंपाइलर के साथ काम करता है।

अस्वीकरण: मैं सी ++ प्रारूप पुस्तकालय के लेखक हूं।





c++ string int