我的字符比较条件有什么问题?

What is wrong with my character comparison conditional?

我这里有一个简单的子例程,它接受一个字符数组和 returns 一个布尔值。

我的条件有问题。我通过传递单个字符串 "A" 来测试它,因此 check_char = 97 并使用短路条件应该为 check_char != 'a' 给出 false。子程序应该return1。但它总是returns 0。这是为什么?这里有什么我没注意到的问题?

/*
 * Checks string of characters and returns 1 if string is a valid DNA sequence and
 * returns 0 if string is not a valid DNA sequence.
 */
int is_valid_dna(char *sequence){
        int i;
        for( i = 0; i < ( sizeof(sequence) / sizeof(sequence[0]) ); i++ ){
                int check_char = tolower(sequence[i]);
                if( check_char != 'a' || check_char != 'c'   
                        || check_char != 'g' || check_char != 't' ){
                        return 0;
                }
        }
        /* If the subroutine made it this far, then the sequence is a valid DNA sequence */
        return 1;
}

编辑:谢谢大家。传递数组的大小并在条件中使用 AND 非常完美。

using short-circuit the conditional should give false for check_char != 'a'

是的,但由于您使用的是 ||,如果答案为真,短路将中止其余条件:我们只需要其中一个子句为真让整件事都成真,这样我们就可以阻止我们发现的一个是真的。但它是错误的,因此您继续 check_char != 'c' 这是正确的,因此我们将其余条件和 return 0.

短路

您的意思是在您的条件之间使用 &&,而不是 ||

也许这就是你想要的:

int is_valid_dna(char *sequence, int numChars){
    int i;
    for (i = 0; i < numChars; i++){
        int check_char = tolower(sequence[i]);
        if (check_char != 'a' && check_char != 'c'
            && check_char != 'g' && check_char != 't'){
            return 0;
        }
    }
    /* If the subroutine made it this far, then the sequence is a valid DNA sequence */
    return 1;
}

我会这样编码:

int is_valid_dna(char *sequence)
{
    for ( ; ; sequence++)
    {
        switch (*sequence)
        {
            case 'a':
            case 'A':
            case 'c':
            case 'C':
            case 'g':
            case 'G':
            case 't':
            case 'T':
            continue;

            case '[=10=]':
            return 1;

            default:
            return 0;
        }
    }
    return 1;
}