2

하나의 문자열 매개 변수가있는 함수를 작성하고 이중 숫자를 반환합니다. 예를 들어 문자열이 fsldnf213414fasfa 인 경우 213414을 반환해야합니다. 그러나 fasfasf123.412412fasfff과 같은 부동 소수점을 123.412412으로 반환 할 수도 있어야합니다.C에서 문자열에서 double을 추출합니다.

I했습니다 이미 정수들만하지 부동 점 추출 할 수있는 기능 :

double get_num(const char* s) 
{ 
    unsigned int limit = UINT_MAX/10; 
    double value = 0; 
    if (!s) { 
     return 0; 
    } 
    for (; *s; ++s) { 
     if (value < limit) { 
      if (isdigit(*s)) { 
       value *= 10; 
       value += (*s - '0'); 
      } 
     } 
     else { 
      return UINT_MAX; 
     } 
    } 
    return value; 
} 
+3

확인 ['strtod']을 (HTTP : // EN .cppreference.com/w/c/문자열/바이트/strtof). –

+0

나는 이미 확인했지만 havent는 double number로 리턴하는 방법을 찾았고 number + floating point + number 만 추출했다. – inix42

답변

1
for (; *s; s++) { 
    if (!isalpha(*s)) { 
     value = strtod(s, NULL); 
     break; 
    } 
} 

결과 :

는 먼저 비 자리 건너 뛸
"fasfasf-123.412412fasfff" 
"fasfasf+123.412412fasfff" 
"fasfasf.123412412fasfff" 

-123.412412 
123.412412 
0.123412 
+0

"dgsgsd %^& £ .5454dfds"는 어떻습니까? :) – JasonD

+0

@JasonD 당신이 그 입력을 기대한다면, 더 느린 방법으로 가야만합니다. – iabdalkader

+0

질문의 입력이 잘 지정되지 않았으므로 어느 대답이 가장 적합한 지 알기 어렵습니다. 그러나 내 접근 방식이 훨씬 느린 경우 질문 할 것입니다. strtod()의 검사가 다른 사람만큼 효율적이라고 상상해보십시오. 함수가 인라인되지 않았다고 가정하면 함수 호출 오버 헤드 문제 일뿐입니다. 구현에 따라 상당히 단순 할 수 있습니다. 성능이 필요하지 않고 이것이 벤치 마크에서 나타나지 않는 한, 여기서는 속도에 대해 걱정하지 않겠습니다. – JasonD

3

, 다음 strtod를 사용을 숫자를 double으로 변환하려면

double get_double(const char *str) 
{ 
    /* First skip non-digit characters */ 
    /* Special case to handle negative numbers and the `+` sign */ 
    while (*str && !(isdigit(*str) || ((*str == '-' || *str == '+') && isdigit(*(str + 1))))) 
     str++; 

    /* The parse to a double */ 
    return strtod(str, NULL); 
} 

작동 예제는 here을 참조하십시오. 대신 isdigit에() 또는 기타의 strtod() 두 번째 추측을 사용

+0

숫자가 음수이면 어떻게됩니까? – JasonD

+0

@JasonD 아 물론 ... 음수를 처리 할 수있는 대답이 업데이트되었습니다. –

+0

그리고 이제는 '+'중 하나를 처리하지 못합니다. – JasonD

2

, 당신이 문자열의 구문 분석 여부를 확인할 수 있습니다 :

char temp[] = "dgsgsd-3.5454dfds"; 

char *t1 = temp; 
char *t2; 
double d; 

do 
{ 
    if(*t1 == 0) return INVALID; 
    d = strtod(t1, &t2);  
} while(t2 == t1++); 

return d; 
+0

같은 질문이 있습니다. 그러나 문자열이 숫자로 시작한다면 어떻게 될까요? 12313asfa1231처럼?다음 번호를 삭제한다고 가정합니다. – inix42

+0

예, 문자열에 여러 숫자가 있으면 그 번호를 확인해야합니다. 함수는 double을 반환합니다. 어쨌든 하나 이상의 숫자를 반환해야하는 경우 충분하지 않을 수 있습니다. 문자열이 부족할 때까지 숫자 모음을 반환하거나 업데이트 된 입력으로 여러 번 호출해야합니다. – JasonD

+0

알겠습니다. 당신 말이 맞아요. 하지만 한 두 배로 원하면 어떻게 될까요? 123132afsaf123123처럼 123132123123. 나는 첫 번째 숫자를 추출 할 수 있었지만 어떻게 나머지 부분에 '추가'할 수 있었습니까? – inix42

관련 문제