我写了这个程序将给定输入的元音转换为大写,将辅音转换为小写。一旦将字符串转换为大写,就将其转换为小写,但是我没有使用strlwr。这是代码..
void main()
{
char a[20], b[20], c[10] = "aeiou";
int t, n;
printf("enter the word");
gets(a);
strlwr(a);
n = strlen(a);
for(t = 0; t<n; t++)
{
if(a[t] == c[0] || a[t] == c[1])
{
strupr(a);
}
else if(a[t] == c[2] || a[t] == c[3])
{
strupr(a);
}
else if(a[t] == c[4])
{
strupr(a);
}
else
{
strlwr(a);
}
b[t] = a[t];
/*line 456*/
}
b[n] = '\0';
printf("%s", b);
}
考虑输入aaasa。第一个是con到upr,第二个是con到lwr(因为字符串在第一个循环中被转换为大写,并且我没有将它更改为小写。),第3个a到upr,s到了lwr,第4个a到upr。这可以通过将strlwr(a)放在456行来解决,但是 我想知道为什么即使在if else块的任何地方都没有使用strlwr的情况下,大写却被转换为小写。 请先回答。谢谢。
答案 0 :(得分:1)
代替使用strlwr / strupr来更改单个字符,只需为相应的操作从char中添加/减去32
。
因此,如果考虑以下行:
char x = 'A';
然后
x += 32;
将x
的值设置为a
。
编辑
您的整个for
循环将是:
for(t=0;t<n;t++)
{
int i;
int vowel = 0;
for(i=0;i<5;i++)
{
if(a[t]==c[i]) //Lowercase vowels
{
a[t]-=32;
vowel = 1;
break;
}
else if((a[t]+32)==c[i]) //Uppercase vowels
{
vowel = 1;
break;
}
}
if(!vowel && a[t]<97)
a[t]+=32;
b[t]=a[t];
}