比較のために、ここで使用するために、任意のベースを受け入れること、atoi()
の簡単な、簡単なバージョンです(つまり、必ずしも10):
#include <ctype.h>
int myatoi(const char *str, int b)
{
const char *p;
int ret = 0;
for(p = str; *p != '\0' && isspace(*p); p++)
;
for(; *p != '\0' && isdigit(*p); p++)
ret = b * ret + (*p - '0');
return ret;
}
(Iが負の数の取り扱いを残していることに注意してください。)
あなたはそれを持っていると、それは、小数点を検出し、同様にそれの右側に数字を処理するために簡単です:
double myatof(const char *str, int b)
{
const char *p;
double ret = 0;
for(p = str; *p != '\0' && isspace(*p); p++)
;
for(; *p != '\0' && isdigit(*p); p++)
ret = b * ret + (*p - '0');
if(*p == '.')
{
double fac = b;
for(p++; *p != '\0' && isdigit(*p); p++)
{
ret += (*p - '0')/fac;
fac *= b;
}
}
return ret;
}
slightl数値的により良い行儀される可能性がありますyのあまり目立たないアプローチは、次のとおりです。
double myatof2(const char *str, int b)
{
const char *p;
long int n = 0;
double denom = 1;
for(p = str; *p != '\0' && isspace(*p); p++)
;
for(; *p != '\0' && isdigit(*p); p++)
n = b * n + (*p - '0');
if(*p == '.')
{
for(p++; *p != '\0' && isdigit(*p); p++)
{
n = b * n + (*p - '0');
denom *= b;
}
}
return n/denom;
}
私は予想通り
123
21
123.123000
5.625000
123.123000
5.625000
を印刷し
#include <stdio.h>
int main()
{
printf("%d\n", myatoi("123", 10));
printf("%d\n", myatoi("10101", 2));
printf("%f\n", myatof("123.123", 10));
printf("%f\n", myatof("101.101", 2));
printf("%f\n", myatof2("123.123", 10));
printf("%f\n", myatof2("101.101", 2));
return 0;
}
でこれらをテストしました。
もう一つ注意:これらの関数は拠点を処理しないFPと10を超える
変換する浮動小数点値の例を表示できますか? –
'。'の前後の部分を単純に変換することができます。 strtolを使って両方の浮動小数点数を浮動小数点数にする –
@ ZachPそれは小数点の前の数字に対して機能しますが、その後はどうなりますか? –