我这里有一个简单的子程序,它接受一个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完美地完成。
答案 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;
}