2015-02-11 122 views
1

我想寫一個函數來解析字符串表示的一個整數。從一個字符串中解析一個int的算法

我的問題是,我不知道如何做到這一點通過字符串一次。如果我知道的時間提前,輸入僅包含字符範圍'0''1',...,'9'並且字符串長度是的n,我當然可以計算

character_1 * 10^(n-1) + character_2 * 10^(n-2) + .... + character_n * 10^0 

,但我要處理與我提出的一般場景一樣。

我不是在尋找一個庫函數,而是一個在「純C」中實現這個功能的算法。

這是我從開始的代碼:

int parse_int (const char * c1, const char * c2, int * i) 
{ 
    /* 
     [c1, c2]: Range of characters in the string 
       i: Integer whose string representnation will be converted 

     Returns the number of characters parsed. 

     Exs. "2342kjsd32" returns 4, since the first 4 characters were parsed. 
      "hhsd3b23" returns 0 
    */ 

    int n = 0; 
    *i = 0; 
    while (c1!= c2) 
    { 
     char c = *c1; 
     if (c >= '0' && c <= '9') 
     { 

     } 
    } 
    return n; 
} 
+1

如果條件'n = n * 10 +(c-'0');' – 2015-02-11 06:33:01

+4

「Pure C,沒有庫包含忽略標準庫嗎? – 2015-02-11 06:41:42

+0

@Lashane那不行。例如,如果字符串是「123」,那麼它將被計算爲1 + 20 + 300 = 321。 – 2015-02-11 06:42:28

回答

0

正如一些評論和答案建議的那樣,可能有點更清楚:在添加新數字之前,必須在每次迭代中將結果乘以10,將結果「左移」。

確實,這應該提醒我們Horner's method。正如你所認識,其結果可以這樣寫一個多項式:

result = c1 * 10^(n-1) + c2 * 10^(n-2) + ... + cn * 10^0 

而這個方程可以改寫成這樣:

result = cn + 10*(... + 10*(c2 + 10*c1)) 

這是這種方法是基於窗體。從公式中你可以看到,你不需要知道10的第一位數字的乘方,直接從頭開始。

下面是一個例子:

#include <stdio.h> 

int parse_int(const char * begin, const char * end, int * result) { 
    int d = 0; 
    for (*result = 0; begin != end; d++, begin++) { 
     int digit = *begin - '0'; 
     if (digit >= 0 && digit < 10) { 
      *result *= 10; 
      *result += digit; 
     } 
     else break; 
    } 
    return d; 
} 

int main() { 
    char arr[] = "2342kjsd32"; 
    int result; 
    int ndigits = parse_int(arr, arr+sizeof(arr), &result); 
    printf("%d digits parsed, got: %d\n", ndigits, result); 
    return 0; 
} 

同樣可以使用sscanf()來實現,每個人都認爲是好的使用C標準庫(也可以處理負數):

#include <stdio.h> 

int main() { 
    char arr[] = "2342kjsd32"; 
    int result, ndigits; 
    sscanf(arr, "%d%n", &result, &ndigits); 
    printf("%d digits parsed, got: %d\n", ndigits, result); 
    return 0; 
} 

的輸出是(兩種實現):

$ gcc test.c && ./a.out 
4 digits parsed, got: 2342 
-2

這裏有一個工作版本:

#include <stdio.h> 

int parse_int (const char * c1, const char * c2, int * i) 
{ 
    /* 
     [c1, c2]: Range of characters in the string 
      i: Integer whose string representnation will be converted 

     Returns the number of characters parsed. 

     Exs. "2342kjsd32" returns 4, since the first 4 characters were parsed. 
     "hhsd3b23" returns 0 
    */ 

    int n = 0; 
    *i = 0; 
    for (; c1 != c2; c1++) 
    { 
     char c = *c1; 
     if (c >= '0' && c <= '9') 
     { 
     ++n; 
     *i = *i * 10 + c - '0'; 
     } 
     else 
     { 
     break; 
     } 
    } 

    return n; 
} 

int main() 
{ 
    int i; 
    char const* c1 = "2342kjsd32"; 
    int n = parse_int(c1, c1+10, &i); 
    printf("n: %d, i: %d\n", n, i); 
    return 0; 
} 

輸出:

 
n: 4, i: 2342 
+0

我不明白downvotes的原因。我誤解了這個問題嗎? – 2015-02-11 15:59:44

-1

我覺得這是很好的解決方案來算解析字符

int parse(char *str) 
{ 
    int k = 0; 
    while(*str) 
    { 
     if((*str >= '0') & (*str <= '9')) 
      break; 
     str++; 
     k++; 
    } 
    return k; 
}