[c++] std :: string을 int로 변환하려면 어떻게해야합니까?

간단한 질문이 있습니다. 나는 인터넷을 둘러 보았고 몇 가지 해결책을 찾았지만 아직 아무것도 작동하지 않았습니다. 문자열을 int로 변환하는 것을 보면서 ASCII 코드를 의미하지는 않습니다.

빠른 요약을 위해 방정식으로 문자열로 전달됩니다. 우리는 그것을 분해하고 올바르게 포맷하고 선형 방정식을 풀어야합니다. 이제는 문자열을 정수로 변환 할 수 없습니다.

문자열이 형식 (-5) 또는 (25) 등이 될 것이므로 확실히 int입니다. 그러나 문자열에서 어떻게 추출합니까?

내가 생각한 한 가지 방법은 문자열을 통해 for / while 루프를 실행하고 숫자를 확인한 후 그 뒤에 모든 숫자를 추출한 다음 선행 ‘-‘가 있는지 확인하고 있다면 int에-를 곱하는 것입니다. 1.

그런 작은 문제는 조금 복잡해 보입니다. 어떤 아이디어?



답변

C ++ 11에는 멋진 새로운 변환 함수 std::string가 숫자 유형으로 있습니다.

그래서 대신

atoi( str.c_str() )

당신이 사용할 수있는

std::stoi( str )

str귀하의 번호는 어디입니까 std::string?

숫자의 모든 맛의 버전이있다 :
long stol(string), float stof(string), double stod(string), … 참조 http://en.cppreference.com/w/cpp/string/basic_string/stol


답변

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

완전히 수정하려면 오류 플래그를 확인해야합니다.


답변

가능한 옵션은 다음과 같습니다.

1. 첫 번째 옵션 : sscanf ()

    #include <cstdio>
    #include <string>

        int i;
        float f;
        double d;
        std::string str;

        // string -> integer
        if(sscanf(str.c_str(), "%d", &i) != 1)
            // error management

        // string -> float
        if(sscanf(str.c_str(), "%f", &f) != 1)
            // error management

        // string -> double 
        if(sscanf(str.c_str(), "%lf", &d) != 1)
            // error management

“필드 너비 제한이없는 scanf가 일부 버전의 libc에서 큰 입력 데이터로 충돌 할 수 있습니다” ( 여기여기 참조 ) 때문에 오류 (cppcheck로도 표시됨) ).

2. 두 번째 옵션 : std :: sto * ()

    #include <iostream>
    #include <string>

        int i;
        float f;
        double d;
        std::string str;

        try {
            // string -> integer
            int i = std::stoi(str);

            // string -> float
            float f = std::stof(str);

            // string -> double 
            double d = std::stod(str);
        } catch (...) {
            // error management
        }   

이 솔루션은 짧고 우아하지만 C ++ 11 호환 컴파일러에서만 사용할 수 있습니다.

3. 세 번째 옵션 : sstreams

    #include <string>
    #include <sstream>

        int i;
        float f;
        double d;
        std::string str;

        // string -> integer
        std::istringstream ( str ) >> i;

        // string -> float
        std::istringstream ( str ) >> f;

        // string -> double 
        std::istringstream ( str ) >> d;

        // error management ??

그러나이 솔루션을 사용하면 잘못된 입력을 구별하기가 어렵습니다 ( 여기 참조 ).

4. 네번째 옵션 : Boost ‘s lexical_cast

    #include <boost/lexical_cast.hpp>
    #include <string>

        std::string str;

        try {
            int i = boost::lexical_cast<int>( str.c_str());
            float f = boost::lexical_cast<int>( str.c_str());
            double d = boost::lexical_cast<int>( str.c_str());
            } catch( boost::bad_lexical_cast const& ) {
                // Error management
        }

그러나 이것은의 래퍼 sstream일 뿐이며 문서는 sstream더 나은 오류 관리 를 위해 사용하도록 제안합니다 ( 여기 참조 ).

5. 다섯 번째 옵션 : strto * ()

이 솔루션은 오류 관리로 인해 매우 길며 여기에 설명되어 있습니다. 일반 int를 반환하는 함수가 없으므로 정수인 경우 변환이 필요 합니다 (이 변환을 수행하는 방법 은 여기 참조 ).

6. 여섯 번째 옵션 : Qt

    #include <QString>
    #include <string>

        bool ok;
        std::string;

        int i = QString::fromStdString(str).toInt(&ok);
        if (!ok)
            // Error management

        float f = QString::fromStdString(str).toFloat(&ok);
        if (!ok)
            // Error management 

        double d = QString::fromStdString(str).toDouble(&ok);
        if (!ok)
    // Error management     

결론

요약하면 가장 좋은 솔루션은 C ++ 11 std::stoi()또는 두 번째 옵션으로 Qt 라이브러리 사용입니다. 다른 모든 솔루션은 권장하지 않거나 버그가 있습니다.


답변

atoi 함수를 사용하여 문자열을 정수로 변환하십시오.

string a = "25";

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

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/


답변

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);
        }
    }
    ...
}


답변

분명히, 내 솔루션은 음의 정수에 대해 작동하지 않지만 정수를 포함하는 입력 텍스트에서 모든 양의 정수를 추출합니다. 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>( theString )일을 잘해야합니다.