【问题标题】:what is wrong with this execution of OR operand in C [closed]在C中执行OR操作数有什么问题[关闭]
【发布时间】:2021-09-30 11:05:03
【问题描述】:

当我将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);
}

【问题讨论】:

标签: c char logical-or


【解决方案1】:

它将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'

【讨论】:

    【解决方案2】:

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

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

    实际上('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,如果包含它意味着 scanf 将期待一个字符串结尾在s

    【讨论】:

      【解决方案3】:

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

      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] ) ) {
          //...
      }
      

      【讨论】:

        【解决方案4】:

        您可能忘记了应该使用带有两个操作数的运算符,因此编译器可以识别每个操作并将它们标记为 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);
        }```
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-03
          • 1970-01-01
          • 2012-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          相关资源
          最近更新 更多