【问题标题】:What is wrong with my character comparison conditional?我的字符比较条件有什么问题?
【发布时间】:2015-06-29 10:30:14
【问题描述】:

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

我的条件有问题。我通过传递单个字符串“A”来测试它,因此 check_char = 97 并使用短路条件应该为 check_char 提供 false !='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 效果很好。

【问题讨论】:

  • 在 c/c++ 中的指针不知道它们有多少元素,因此您应该添加另一个参数来指示数组中的 num 个元素
  • @2501 我相信这将是一个有效的 DNA 序列。这不应该是一个严肃的计划。老实说,这是我多年前上过的一门课的旧项目之一,我正在重新编程以进行有趣的/C 练习。
  • @user3370603 没关系,我的假设是错误的。

标签: c pointers if-statement short-circuiting


【解决方案1】:

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

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

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

【讨论】:

  • 嗯,是的,我明白了。当我使用 AND 时,我仍然得到相同的结果。
  • || 更改为&amp;&amp; 对我有用。这是一个ideone演示:ideone.com/82ySP1
【解决方案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;
}

【讨论】:

  • 长度不错。您可能可以在这里使用 strlen 来计算 numChars,或者只是不断增加 i 直到 sequence[i] == 0(在 toLower 之前测试)
  • 仍然不明白为什么这是必要的。也许我没有完全理解 C 中的字符指针。
  • @Rup:是的,你也可以这样做,但我更喜欢明确传递#chars-off 当然我更喜欢处理 std::string
  • @user3370603:C/C++ 中的每个指针都是如此——它们不像 C#/Java 样式的数组,它们了解它们包含的内容和数量。指针是指向原始内存的地址。因此,理想情况下,您应该传入 numChars(另一种方法是使用 strlen,但如果您到达那里,为什么不使用 std::string 代替)
  • 我明白了。我将更新以使用 strlen。我也在用 C 编码,而不是 C++。
【解决方案3】:

我会这样编码:

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

【讨论】:

  • 这是一个很好的例子,但它没有回答 OP 提出的问题。考虑先解决实际问题,然后添加您的示例。
  • "...我正在重新编程它以获得乐趣 / C 练习。" -- 他可以通过这段代码了解更多信息,...而且它比“strlen/if”方法更快, ......这是一个不公平的投票!
猜你喜欢
  • 2023-02-14
  • 1970-01-01
  • 2016-07-18
  • 2012-03-12
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
相关资源
最近更新 更多