【问题标题】:I don't know what I'm doing wrong. I think my condition is right我不知道我做错了什么。我觉得我的条件是对的
【发布时间】:2022-11-18 17:50:16
【问题描述】:
char ch;
    do
    {
        printf("Digite aqui um caractere: ");
        scanf(" %c", &ch);
    } while ((ch < 'A' && ch > 'Z' ) || (ch < 'a' && ch > 'z') || ch != '.');
    return ch;

在这种情况下,我尝试了各种各样的事情,但我无法做到。当输入是 [A-Z] 或 [a-z] 或 '.' 时,我想返回“ch”的值。

【问题讨论】:

  • 请选择一个真正描述您的问题的标题。

标签: c do-while logical-operators logical-or logical-and


【解决方案1】:

在循环的情况下

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 != '.' ));

另一种方法是使用标头&lt;ctype.h&gt;中声明的标准函数tolowertoupper来简化条件,例如

while ( ( toupper( ( unsigned char )ch ) < 'A' || toupper( unsigned char )ch ) > 'Z' ) && ( ch != '.' ));

【讨论】:

  • 非常感谢 :D 我必须更好地研究我的逻辑!
  • @ManuelJohnnyTapAndr 完全没有。我们初学者应该互相帮助。:)
  • !isalpha(ch) &amp;&amp; (ch != '.')怎么样?
  • @Gerhardh 这是个好主意。 :)
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多