繁体   English   中英

我不知道我做错了什么。 我认为我的条件是正确的

[英]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 tolowertoupper来简化条件,例如

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM