2015-02-11 121 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; 
}