我的角色比较条件有什么问题?

时间:2015-04-22 01:30:26

标签: c pointers if-statement short-circuiting

我这里有一个简单的子程序,它接受一个char数组并返回一个布尔值。

我的条件有问题。我通过传递单个字符串“A”来测试它,因此check_char = 97并且使用短路条件应该为check_char!='a'给出假。子程序应该返回1.但它总是返回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完美地完成。

3 个答案:

答案 0 :(得分:3)

  

使用短路条件应该为check_char!='a'

给出假

是的,但是因为你正在使用||,如果答案是真的,那么短路就会中止剩下的条件:我们只需要其中一个条款成立即可整个事情是真的,所以我们可以阻止我们发现一个真实的。但这是假的,所以你继续check_char != 'c'这是真的,所以我们将剩下的条件短路并返回0。

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

答案 1 :(得分:2)

也许这就是你想要的:

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;
}

答案 2 :(得分:-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 '\0':
            return 1;

            default:
            return 0;
        }
    }
    return 1;
}