如何指出错误,因为所有数字都是有效的返回值?

Joh*_*inz 4 c

  • 编译器:GCC 4.4.5(代码::块)
  • 平台:Linux内核版本2.6.32-5-686(Debian)

我目前正在编写一个将字符串转换为double longs的函数.我知道已经有一个功能可以做到这一点.我只是为练习写这个功能,但我现在不知道该怎么做.

当我的函数只能处理正双倍长度时,我的函数正常工作,因为如果它们是字符串中的无效字符,我可以返回-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;
}
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 5

返回一个指针是复杂而低效的,因为你需要malloc一个缓冲区,然后记住free它.这对于返回一个简单的固定大小的值来说是一个很大的开销.相反,您可以返回状态代码并将结果写入指针:

// returns zero on success, -1 on error
int cstrtodl(const char *cstr, long double *result);
Run Code Online (Sandbox Code Playgroud)

出于某些目的,如果您不一定要阅读所有字符串,那么了解字符串的消耗量可能也很有用.在这种情况下,您可以返回一个size_tssize_t,并且在出错时返回0(没有输入消耗)或-1.然后,调用者可以检查输入字符串中的数字是否出现意外情况.

errno在C中完全允许设置.