C:有符号整数的sentinel值?

时间:2013-08-16 13:48:55

标签: c sentinel

我正在编写一个程序,我需要将字符数组转换为整数。但是,我不是只使用正整数,而是需要利用所有整数的全部潜力(当然,在int类型的能力范围内)(即:正,负和0)。但是我需要访问一些标记值,非常如此最好在类型int内。我不想让所有事情float只是如此我可以使用一个非整数哨兵,如果我可以避免它。

暂时解决这个问题,我刚刚使用了以下“技巧”:(其中token是数组)

int TokenToInt(char token[])
{
    int current=0, value=0;
    char isNeg = 'F';

    if (token[current] == '-') {
        isNeg = 'T';
        current++;
    }

    while (1) {
        if (isdigit(token[current]) == 0)
            return -1;
        else {
            value *= 10;
            value += token[current]-'0';
        }

        current++;
    }

    if (isNeg == 'F') return value;
    if (isNeg == 'T') return -1 * (value + 1);
}

因此,在程序的其余部分中,您使用-1进行错误检查,一旦完成该操作,如果返回值为负,则递增返回值。除非可能用户输入-2^15,但最好不能输入-1以外,哪个有效?

但它也很麻烦,有点混乱,只是随机增加价值。那么我应该坚持使用这种^方法还是有替代方案来完成同样的任务?如果有替代方案,那么这个替代方案是什么?

1 个答案:

答案 0 :(得分:2)

如果我正确地更新了这个,你真的说你需要返回一个int,但你还需要能够检测到错误。有两种常见的方法:将返回值放在通过引用传递的参数中,或者添加另一种方法来设置/获取错误。

首先,它会像

int myfcn(int* result, char[] input) {
    // do stuff
    ...
    if( success ) {
        *result = ...;
        return ERROR_SUCCESS;
    } else {
        return ERROR;
    }
}

第二个看起来像......

void caller() {
    int value = TokenToInt(...);
    if( getLastError() != ERROR_SUCCESS ) {
        // handle the error
    }
}

int TokenToInt(...) {
    // do stuff
    if( error ) {
        setLastError(ERROR_WHATEVER);
        return result
    }
    return result;
}

您可以查看getLastError函数以获取更多详细信息。