将字符串转换为整数的程序

时间:2014-09-28 19:55:35

标签: c arrays string

我写的代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
int strToint(char []);
int main()
{
    char str[20];
    printf("Enter the string-");
    gets(str);
    printf("\nthe integer is %d ",strToint(str));
    return 0;
}
int strToint(char str[])
{
    int i,a,sum=0,k,j;
    a=strlen(str);
    for(i=0;i<a;i++)
    {
        k=str[i]-'0';
        j=pow(10,a-i-1);
        sum+=k*j;
    }
    return sum;
}

如果我输入输入,比如567,我得到562,但我不明白为什么。我觉得这可能与战俘功能有关。

帮助表示赞赏。谢谢!

3 个答案:

答案 0 :(得分:2)

pow()是一个浮点函数,其行为因系统而异。标准没有要求其准确性。您的系统似乎没有以您需要的准确度返回值。

您不需要实现将文本转换为整数的函数,因为标准库包含执行此操作的函数。一个明显的选择是sscanf

但是如果必须实现这样的函数,则应该使用整数运算。任何此类代码都应处理负值,并检查无效输入。例如。将"a"传递给函数后会发生什么?

答案 1 :(得分:2)

我测试了你的代码并获得了预期的结果。也许问题与功能战有关。

您可以在不使用处理实数的函数的情况下更简单地编写函数。

例如

int strToint( const char str[] )
{
    int sum = 0;

    for ( ; *str; ++str )
    {
        sum = 10 * sum + *str - '0';
    }

    return sum;
}

考虑到函数gets不安全。最好使用函数fgets。例如

fgets( str, 20, stdin );

size_t n = strlen( str );
if ( str[n - 1] == '\n' ) str[n - 1] = '\0';

答案 2 :(得分:1)

在第一次调用pow(10,2)时,图书馆的弱pow()会返回99.999 ...在分配给j时会被截断为99。

由于第一个数字是5,因此最终总和少于5。 (100 * 5 vs 99 * 5)

如果代码必须使用FP函数,最好在整数赋值之前进行舍入

j = round(pow(10,...));

正如@Vlad指出的那样,所有的FP数学都可以避免。

-

C不要求浮点函数准确。一个好的 pow()函数应该在这里提供了一个确切的答案,这就是为什么它在很多其他机器上工作的原因。

对于完整的atoi,有很多帖子,例如FromStringToInteger