[c++] 문자열이 C ++의 숫자인지 확인하는 방법은 무엇입니까?

문자열이 숫자인지 확인하는 함수를 작성하는 데 약간의 문제가있었습니다. 내가 쓰고있는 게임의 경우 읽고있는 파일의 줄이 숫자인지 확인해야합니다 (이 방법으로 매개 변수인지 알 수 있습니다). 나는 부드럽게 작동한다고 생각하는 아래 기능을 작성했습니다 (또는 실수로 편집하지 않거나 정신 분열증이거나 Windows가 정신 분열증입니다).

bool isParam (string line)
{
    if (isdigit(atoi(line.c_str())))
        return true;

    return false;
}



답변

가장 효율적인 방법은 숫자가 아닌 문자를 찾을 때까지 문자열을 반복하는 것입니다. 숫자가 아닌 문자가 있으면 문자열을 숫자가 아닌 것으로 간주 할 수 있습니다.

bool is_number(const std::string& s)
{
    std::string::const_iterator it = s.begin();
    while (it != s.end() && std::isdigit(*it)) ++it;
    return !s.empty() && it == s.end();
}

또는 C ++ 11 방식으로 수행하려면 다음을 수행하십시오.

bool is_number(const std::string& s)
{
    return !s.empty() && std::find_if(s.begin(),
        s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}

아래 주석에서 지적했듯이 양의 정수에만 작동합니다. 음의 정수 또는 분수를 감지해야하는 경우보다 강력한 라이브러리 기반 솔루션을 사용해야합니다. 음의 정수에 대한 지원을 추가하는 것은 쉽지 않습니다.


답변

왜 바퀴를 재발 명합니까? C 표준 라이브러리 (C ++에서도 사용 가능)에는 정확히 다음을 수행하는 기능이 있습니다.

char* p;
long converted = strtol(s, &p, 10);
if (*p) {
    // conversion failed because the input wasn't a number
}
else {
    // use converted
}

분수 또는 과학적 표기법을 처리 strtod하려면 대신에 double결과를 얻으십시오 .

C / C ++ 스타일 ( "0xABC") 에서 16 진 및 8 진 상수를 허용 하려면 0대신 마지막 매개 변수를 작성하십시오 .

그러면 함수는 다음과 같이 쓸 수 있습니다

bool isParam(string line)
{
    char* p;
    strtol(line.c_str(), &p, 10);
    return *p == 0;
}


답변

C ++ 11 컴파일러를 사용하면 음이 아닌 정수에 대해 다음과 같은 것을 사용합니다 ( ::대신에 참고 std::).

bool is_number(const std::string &s) {
  return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit);
}

http://ideone.com/OjVJWh


답변

boost :: lexical_cast를 사용하여 C ++ 방식으로 할 수 있습니다. 부스트를 사용하지 말 것을 정말로 주장한다면 그 기능을 검사하고 수행 할 수 있습니다. 꽤 간단합니다.

try
{
  double x = boost::lexical_cast<double>(str); // double could be anything with >> operator.
}
catch(...) { oops, not a number }


답변

반복을 사용하는이 아이디어를 던지기를 원했지만 다른 코드는 반복을 수행합니다.

#include <string.h>

bool is_number(const std::string& s)
{
    return( strspn( s.c_str(), "-.0123456789" ) == s.size() );
}

소수점이나 빼기 기호를 확인할 때처럼 각 위치와 위치에 둘 이상이있을 수 있기 때문에 견고하지 않습니다. 좋은 점은 한 줄의 코드이며 타사 라이브러리가 필요하지 않다는 것입니다.

‘.’을 꺼내십시오. 양의 정수가 모두 허용되는 경우 ‘-‘.


답변

정규식 접근 방식을 제안합니다. 전체 정규 표현식 일치 (예 : boost :: regex 사용 )

-?[0-9]+([\.][0-9]+)?

문자열이 숫자인지 아닌지를 보여줍니다. 여기에는 양수와 음수, 정수 및 소수가 포함됩니다.

다른 변형 :

[0-9]+([\.][0-9]+)?

(긍정적)

-?[0-9]+

(정수만)

[0-9]+

(양의 정수만)


답변

<regex>라이브러리를 사용하여 수행하는 다른 방법은 다음과 같습니다 .

bool is_integer(const std::string & s){
    return std::regex_match(s, std::regex("[(-|+)|][0-9]+"));
}