- コンパイラ: GCC 4.4.5 (コード::ブロック)
- プラットフォーム: Linux カーネル バージョン 2.6.32-5-686 (Debian)
現在、文字列を double long に変換する関数を作成しています。これを行う機能がすでにあることは承知しています。練習のためにこの関数を書いているだけですが、現在何をすべきかわかりません。
私の関数は、正の double long のみを処理できる場合に正しく機能しました。これは、文字列内の無効な文字である場合に -1 を返す可能性があるためです。しかし、私は関数が正と同様に負の double long を処理できるようにしたいと考えています。現在、すべての実数が有効な戻り値であるため、この状況で何をすべきかわかりません。無効な文字を 10 進値に変換するか、単に無効な文字を無視して有効な文字 0 ~ 9 (10 進数 48 ~ 57) のみを選択することにより、無効な文字が存在しても変換を続行することを考えました。errno
また、double long へのポインターを返し、無効な文字が見つかったことを示すために NULL アドレスを使用するか、関数のように設定することも考えました。readdir()
. どのように設定するのerrno
か、またはそれが許可されているかどうかはわかりません。それで、私の質問は全体として、この状況で私が何をすることをお勧めしますか? また、負の double long の処理はまだ含めていないことに注意してください。関数は単に無効な文字を無視します。たとえば$&3%7AJ89
、3789 に変換されます。
double long cstrtodl(const char *cstr)
{
double long power;
double long dl = 0;
int decimal_place;
int bool_decimal = 0;
for(decimal_place = 1; cstr[decimal_place] != '\0'; decimal_place++)
{
if(cstr[decimal_place] == '.')
{
bool_decimal = decimal_place;
break;
}
}
for(decimal_place--, power = 1; decimal_place >= 0; decimal_place--, power *= 10)
{
printf("[%i] = %i(%c)\nPOWER = %LF\nINTEGER = %LF\n", decimal_place, (int)cstr[decimal_place], cstr[decimal_place], power, dl);
switch(cstr[decimal_place])
{
case 48:
dl += 0 * power;
break;
case 49:
dl += 1 * power;
break;
case 50:
dl += 2 * power;
break;
case 51:
dl += 3 * power;
break;
case 52:
dl += 4 * power;
break;
case 53:
dl += 5 * power;
break;
case 54:
dl += 6 * power;
break;
case 55:
dl += 7 * power;
break;
case 56:
dl += 8 * power;
break;
case 57:
dl += 9 * power;
break;
default:
power /= 10;
break;
}
}
if(bool_decimal > 0)
{
for(decimal_place = bool_decimal+1, power = 10; cstr[decimal_place] != '\0'; decimal_place++, power *= 10)
{
printf("[%i] = %i(%c)\nPOWER = %LF\nINTEGER = %LF\n", decimal_place, (int)cstr[decimal_place], cstr[decimal_place], power, dl);
switch(cstr[decimal_place])
{
case 48:
dl += 0 / power;
break;
case 49:
dl += 1 / power;
break;
case 50:
dl += 2 / power;
break;
case 51:
dl += 3 / power;
break;
case 52:
dl += 4 / power;
break;
case 53:
dl += 5 / power;
break;
case 54:
dl += 6 / power;
break;
case 55:
dl += 7 / power;
break;
case 56:
dl += 8 / power;
break;
case 57:
dl += 9 / power;
break;
default:
power /= 10;
break;
}
}
}
return dl;
}