我的字符比较条件有什么问题?
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;
}
我这里有一个简单的子例程,它接受一个字符数组和 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;
}