K & R ex。 4.2では指数(123e6や456e-7など)を扱うための指数ハンドリングメカニズムがない、与えられた(非標準の)atof関数を変更するように頼みます。私は、正しく入力され、スペースフリーの1桁指数を扱うために最小限の変更を加えました。それが動作していたかどうかを調べるために、サンプル入力データとprintf関数をmainに追加しました。戻り値はすべてオフです(一部はゼロ、符号や小数点はありません)。誰かがこれを改善するのに役立つことができる?コード:at exercise(K&Rセクション4.2、エクササイズ4.2)
#include <ctype.h>
double antof(char[]); /* name changed to protect the innocent
and avoid references to stdlib functions */
int main()
{
char putin1[] = "12345";
char putin2[] = "987.65";
char putin3[] = " -2468";
char putin4[] = "12e2";
char putin5[] = " -34E-3";
printf ("%s \t %s \t %s \t %s \t %s \n\n", putin1, putin2, putin3, putin4, putin5);
double converted1 = antof(putin1);
double converted2 = antof(putin2);
double converted3 = antof(putin3);
double converted4 = antof(putin4);
double converted5 = antof(putin5);
printf ("%d \t %d \t %d \t %d \t %d", converted1, converted2, converted3, converted4, converted5);
return 0;
}
/* atof: convert string s to double */
double antof(char s[])
{
double val, power;
int i, sign;
for (i = 0; isspace(s[i]); i++) /* skip white space */
;
sign = (s[i] == '-') ? -1 : 1;
if (s[i] == '+' || s[i] == '-')
i++;
for (val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
i++;
for (power = 1.0; isdigit(s[i]); i++) { /*tracks right side of decimal, keeps adding to val */
val = 10.0 * val + (s[i] - '0'); /* but keeps multiplying power by 10 to keep track of decimal place */
power *= 10;
}
/* added from here to handle scientific notation */
int exponenty;
int exponentysign;
if (s[i] == "e" || s[i] == "E")
i++;
if (s[i] == '-')
exponentysign == -1;
i++;
exponenty = (s[i] - '0');
/* full functionality would require storing data like val and power
but here I assume single digit exponent as given in the example */
if (exponentysign == -1)
exponenty = (1/exponenty);
return (sign * val/power) * (10^exponenty);
}
いつものようにありがとう。
私たちはコードレビューではありません。コードが正しく動作している場合は、そのコードを試してみてください。問題があれば、[ask]を読んで助言に従ってください。また、コードを適切にフォーマットします。 – Olaf
@Olaf OPはコードが正しく動作していないと言っていますが、これはコードレビューで話題にならないでしょう。 – Phrancis