我有一些我写过的代码试图将元音大写并使辅音小写。然而,它只输出一切资本,即
ABCDEsFGE
是
的输出abcsdefge
int main(void)
{
int a;
printf("Non vowels in lower cap: ");
}
}
int vowerls (int f)
{
f = getchar();
f = ? : putchar(tolower(cf));
return c;
}
我在这里缺少什么?
答案 0 :(得分:3)
逻辑OR运算符||
根据操作数是评估为0
还是1
返回0
或1
。对于'a'
,'b'
等操作数,它始终被视为真值(1
,非零)。因此,您的支票不符合您期望的目的。
引用C11
标准,章节§6.5.14
||
运算符如果其任一操作数比较不等于0,则应得1;否则,它会产生0。
您可以使用(落实)switch
案例来完成工作。
答案 1 :(得分:3)
该行
cellForRow
造成了这个问题。首先,正如@RichTolley所说,您需要使用c = ( 'a' || 'e' || 'i' || 'o' || 'u') ? putchar(toupper(c)) : putchar(tolower(c));
而不是==
。假设你这样做,你将拥有的是
=
由于括号是第一个,它将首先评估括号中的内容,然后才与c == ('a' || 'e' || 'i' || 'o' || 'u') : // etc.
进行比较。由于非零整数(并且,通过扩展,字符)是真实的,它将看到c
,它读作97,将其评估为真,注意它后面有'a'
,并且停止评估,因为真||
任何事都是真的。因此,它总是将三元运算符的第一部分评估为真,并打印出大写字母。你需要的是
||
这实际上会检查(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') : // etc.
是否等于其中之一。
答案 2 :(得分:2)
使用('a' || 'e' || ...
,您不会将这些字母与c
进行比较。你只是评估5个字母的逻辑or
,这将永远是真的。试试(c == 'a' || c == 'e' || ...
答案 3 :(得分:0)
请一致地缩进代码,在每个操作支架后建议4个空格' {' 并且在每个结束括号之前取消缩进'}'
永远不要使用制表符进行缩进,因为每个字处理器/编辑器都有不同的制表符/制表符宽度
即使使用可变宽度字体,这4个空格也足够宽,可以看到
在C中,不能做复合比较,需要分别进行比较
main()函数需要输入下一个char,因此可以传递给isvowel()函数 并检查输入结束
' ='是作业,' =='是比较
有时,' y'是一个元音,代码不处理这种可能性
未使用isvowel()返回的值,因此更改为返回void
从终端输入时,结果将是屏幕上的隔行扫描字符 可能希望将结果保存到缓冲区中,并将printf()放在最后的缓冲区
// prototype
void isvowel( int );
int main(void)
{
int a;
printf("Type letters; non-vowels will be printed lower case, vowels will be printed uppercase: ");
while ( (a = getchar()) && (a != EOF) )
{
isvowel(tolower(a));
}
return 0;
}
void isvowel (int c)
{
(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') ? putchar(toupper(c)) : putchar(tolower(c));
}
答案 4 :(得分:0)
其他答案指出了你的错误以及如何正确地进行比较。
长链比较可能会变得有点笨拙。您也可以检查当前字符是否在库函数strchr
的某个字符串中找到,这使得比较更加简洁:
if (strchr("aeiou", c)) ... // character is a lower-case vowel
您必须<string.h>
包含strchr
。