- 编译器:GCC 4.4.5(代码::块)
- 平台:Linux 内核版本 2.6.32-5-686 (Debian)
我目前正在编写一个将字符串转换为 double long 的函数。我知道已经有一个功能可以做到这一点。我只是为了练习而编写这个函数,但我目前不知道该怎么做。
当我的函数只能处理正双长时,我的函数可以正常工作,因为如果它们是字符串中的无效字符,我可以返回 -1。但我希望该函数能够处理负双长以及正数。我不知道在这种情况下我应该做什么,因为现在所有实数都是有效的返回值。我考虑过通过将无效字符转换为十进制值或简单地忽略无效字符并仅选择有效字符 0-9(十进制 48-57)来继续转换,即使存在无效字符。我还考虑过返回一个指向 double long 的指针并使用 NULL 地址来指示找到了无效字符,或者我可以errno
像函数一样设置readdir()
. 我不确定我将如何进行设置errno
,或者是否允许这样做。所以我的整体问题是你们会建议我在这种情况下做什么?另请注意,我尚未包含对负双长的处理,该函数将简单地忽略无效字符:例如$&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;
}