-2

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

4 回答 4

3

它与表达式 进行比较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'
于 2021-07-23T09:42:58.793 回答
1

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

3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 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] ) ) {
    //...
}
于 2021-07-23T09:58:53.863 回答
1

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

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

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

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

当然,将字符一一分开会起作用,因为现在每个单独的比较都将按预期进行。

如果你不喜欢 longif你可以使用:

#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);
}

或者您可以使用strchrVlad 发布的内容。


附带说明一下,scanf("%[^\n]s", str);应该是scanf("%[^\n]", str);,说明%[^\n]符最后不需要 a s,如果包含它,则意味着scanf将期待一个以 . 结尾的字符串s

于 2021-07-23T10:00:42.247 回答
0

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