2013-03-19 4 views
1

"$ :" "213.23453" 과 같은 많은 문자가있는 문자열이 있습니다. 213.23453의 double 값을 어떻게 추출하고 C++/C에 저장합니까? 나는 람다를 사용하지 않는다.문자열이있는 문자열에서 double을 추출하는 중

+0

cpp의 Regex를 시도하십시오. – Prasad

+0

['stod'] (http://en.cppreference.com/w/cpp/string/basic_string/stof) –

+0

먼저 C 또는 C++를 작성하는지 여부를 결정해야합니다. 답은 두 언어에 따라 다릅니다. –

답변

1

당신은 첫 번째 자리에 전에 문자를 스킵하는 sscanf 기능의 "가난한 사람의 정규식"을 사용하여 다음과 같이 이중 읽기 수 있습니다 : 첫 번째 비율 후 별표

char *str = "\"$: \" \"213.23453\""; 
double d; 
sscanf(str, "%*[^0-9]%lf", &d); 

주 형식 : sscanf에 내용을 출력 버퍼에 쓰지 않고 문자열을 읽도록 지시합니다.

여기는 demo on ideone입니다.

0

정규식을 사용하십시오.

[$]?[0-9]*(\.)?[0-9]?[0-9]?

이것은 $ 기호와없는 사람과 일치해야합니다.

Boost.Regex는 개인적으로 작업하기 훨씬 좋네요을 Boost.Xpressive을 찾을 아주 좋은 정규 표현식 라이브러리

입니다. 이것은 헤더 전용 라이브러리이며 정적 정규식 (컴파일시 컴파일 된 정규식)과 같은 멋진 기능이 있습니다.

C++ 11 호환 컴파일러를 사용하는 경우 다른 이유가없는 한 std::regex을 사용하십시오.

+1

그러나 GCC 4.7을 사용하는'std :: regex'가 제대로 컴파일 되긴하지만 실제로는 매우 기능이 올바르지 않습니다. –

0

순수 C++ 솔루션은 수동으로 번호 (std::isdigit에 의해 확인 된 첫 번째 숫자)를 앞 휴지통 문자를 차단 한 후 바로 검색 할 임시 istringstream 객체를 생성하는 수 double에서 :

std::string myStr("$:. :$$#&*$ :213.23453$:#$;"); 

// find the first digit: 
int startPos = 0; 
for (; startPos < myStr.size(); ++startPos) 
    if (std::isdigit(myStr[startPos])) break; 

// cut off the trash: 
myStr = myStr.substr(startPos, myStr.size() - startPos); 

// retrieve the value: 
double d; 
std::istringstream(myStr) >> d; 

하지만 C- 스타일 sscanf을 적절히 지정하면 다음과 같이 충분합니다.

관련 문제