微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中执行 OR 操作数有什么问题

如何解决在 C 中执行 OR 操作数有什么问题

当我将 str[i] 与其所有元音分开时,当前执行有什么问题?

#include <stdio.h>
#include<string.h>
 
int main() {

    int k = 0;
    char str[100];

    scanf("%[^\n]s",str);

    for(int i = 0; i < strlen(str); i++){
        if(str[i] == ('a' || 'e' || 'i' || 'o' || 'u')){
           k++;
        }
     }
     printf("%d",k);
}

解决方法

它将 str[i] 与表达式 'a' || 'e' || 'i' || 'o' || 'u' 进行比较,该表达式的计算结果为 true,该值等于 1。将字符视为整数,char 对应于(在 ASCII 中),那么您的表达式将是 97 || 101 || ...,这当然是 true

要使这项工作按预期进行,您需要拆分所有比较:

str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u'
,

根据 C 标准(6.5.14 逻辑 OR 运算符)

3 ||如果其任一操作数比较,则运算符应产生 1 不等于0;否则,结果为 0。结果为 int 类型。

所以这个主要表达式在 if 语句的条件中

('a'||'e'||'i'||'o'||'u')

is 总是计算为整数 1,因为至少第一个操作数 'a' 不等于 0

所以实际上这个 if 语句

if(str[i]==('a'||'e'||'i'||'o'||'u')){

相当于

if( str[i] == 1 ){

并且它仅在 str[i] 等于 1 的一种情况下评估为逻辑真。

你需要写

if( str[i] == 'a' || str[i] == 'e'|| str[i] == 'i'|| str[i] == 'o'|| str[i] == 'u' ){

另一种方法是使用标准函数 strchr。例如

if ( strchr( "aeiou",str[i] ) ) {
    //...
}
,

当我将 str[i] 与所有元音分开时,它会起作用...

这是因为您将一个字符与一个布尔表达式进行比较,这将是 10,这种比较永远不会为真,str 不会有任何带有 01 代码的字符,这些是不可打印的控制字符。

实际上('a'||'e'||'i'||'o'||'u')等价于(97 || 101 || 105 || 111 || 117)这些都是以每个字符的ASCII码为例,其他编码会有不同的代码,这才是你的程序真正看到的。

无论如何,OR 的这个序列将评估为 1,所以假设 str[i]'a',比较将是 97 == 1,这当然是假的,其他元音也一样,所以 k 永远不会递增。

当然,将字符一个一个地分开是可行的,因为现在每个单独的比较都将按预期进行。

如果您不喜欢长 if,您可以使用 :

#include <stdio.h>
#include <string.h>

int main() {
    
  int k = 0;
  char str[100];

  scanf("%[^\n]",str);

  for (int i = 0; i < strlen(str); i++) {
      switch(str[i]){
          case 'a': case 'e': case 'i': case 'o': case 'u':
              k++;
      }
  }
  printf("%d",k);
}

或者您可以使用 Vlad 发布的 strchr


附带说明,scanf("%[^\n]s",str); 应该是 scanf("%[^\n]",str);%[^\n] 说明符在末尾不需要 s,如果包含它,则意味着 { {1}} 将期待以 scanf 结尾的字符串。

,

您可能忘记了应该使用带有两个操作数的运算符,以便编译器可以识别每个操作并将它们标记为 True 或 False。改用此代码:

 
int main() {
    int k=0;
    char str[100];
      scanf("%[^\n]s",str);
    for(int i=0;i<strlen(str);i++){
        if((str[i]== 'a')||(str[i] == 'e')||(str[i] == 'i')||(str[i] == 'o')||(str[i] == 'u')){
        k++;
        }
    }
 printf("%d",k);
}```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?