我写的代码如下:
#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,但我不明白为什么。我觉得这可能与战俘功能有关。
帮助表示赞赏。谢谢!
答案 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