当我将 str[i] 与所有元音分开时,它会起作用......
这是因为您正在将一个字符与一个布尔表达式进行比较,该表达式将是1
or 0
,这种比较永远不会是真的,str
不会有任何带有0
or1
代码的字符,这些是不可打印的控制字符。
实际上('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);
}
或者您可以使用strchr
Vlad 发布的内容。
附带说明一下,scanf("%[^\n]s", str);
应该是scanf("%[^\n]", str);
,说明%[^\n]
符最后不需要 a s
,如果包含它,则意味着scanf
将期待一个以 . 结尾的字符串s
。