[英]I don't know what I'm doing wrong. I think my condition is right
char ch;
do
{
printf("Digite aqui um caractere: ");
scanf(" %c", &ch);
} while ((ch < 'A' && ch > 'Z' ) || (ch < 'a' && ch > 'z') || ch != '.');
return ch;
我在这种情况下尝试了各种事情,但我无法做到。 当输入是 [AZ] 或 [az] 或 '.' 时,我想返回“ch”的值。
在循环的情况下
while ((ch < 'A' && ch > 'Z' ) || (ch < 'a' && ch > 'z') || ch != '.');
例如因此子表达式
(ch < 'A' && ch > 'Z' )
总是计算为逻辑假,因为一个字符不能同时小于'A'
和大于'Z'
。
为了简化条件,首先针对应该中断循环的情况重写它。
循环中断时
( ( 'A' <= ch && ch <= 'Z' ) || ( 'a' <= ch && ch <= 'z') || ( ch == '.' ));
现在写下它的否定
!( ( 'A' <= ch && ch <= 'Z' ) || ( 'a' <= ch && ch <= 'z') || ( ch == '.' ));
你会得到
( !( 'A' <= ch && ch <= 'Z' ) && !( 'a' <= ch && ch <= 'z') && !( ch == '.' ));
它与
( ( !('A' <= ch ) || !( ch <= 'Z' ) ) && ( !( 'a' <= ch ) || !(ch <= 'z' )) && ( ch != '.' ));
或者
( ( ch < 'A' || ch > 'Z' ) && ( ch < 'a' || ch > 'z' ) && ( ch != '.' ));
所以你会有
while ( ( ch < 'A' || ch > 'Z' ) && ( ch < 'a' || ch > 'z' ) && ( ch != '.' ));
另一种方法是使用在 header <ctype.h>
中声明的标准 function tolower
或toupper
来简化条件,例如
while ( ( toupper( ( unsigned char )ch ) < 'A' || toupper( unsigned char )ch ) > 'Z' ) && ( ch != '.' ));
或者根据@Gerhardh的非凡想法,你也可以写
while ( !isalpha( ( unsigned char )ch ) && ( ch != '.' ));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.