2012-12-04 55 views
2

我想在C中編寫一個具有一個字符串參數並返回一個雙精度數字的函數。 例如,當字符串爲fsldnf213414fasfa時,應返回213414。 但它也應該能夠返回浮點數fasfasf123.412412fasfff作爲123.412412從c中的一個字符串中提取雙倍數字

我已經是隻能提取整數不是浮點功能:

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

我已經檢查過它,但我還沒有找到一種方法將它返回到一個雙數字,只提取到數字+浮點數+數字。 – 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作爲一個工作示例。

+0

如果數字爲負數會發生什麼? – JasonD

+0

@JasonD啊當然...更新的答案能夠處理負數。 –

+0

現在它不處理領先的'+':) – JasonD

2

而不是使用ISDIGIT()或其他方式的strtod()的猜測,你可以檢查,看它是否解析任何字符串:

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

相關問題